Cod sursa(job #2094487)

Utilizator alinp25Alin Pisica alinp25 Data 25 decembrie 2017 22:43:46
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <bits/stdc++.h>

// Define Infinity as 2e9
#define INF 2e9

using namespace std;

//Define Integer Pair
typedef pair<int, int> iPair;

//Directed graph class || Adjacency list representation
class Graph {
	private:
		int V; // Number of vertices
		list< pair<int, int> > *adj;  // Storing Vertex and Pair for every edge
	public:
		Graph(int V);  // Constructor
		void addEdge(int u, int v, int w); // Function to add an edge to a graph
		void primMST(); // Print MST
};

Graph::Graph(int V) {
	this->V = V;
	adj = new list<iPair> [V];
}

void Graph::addEdge(int u, int v, int w) {
	adj[u].push_back(make_pair(v, w));
	adj[v].push_back(make_pair(u, w));
}

void Graph::primMST() {
	int totalCost = 0, edges = 0;

	std::ofstream fout("apm.out");
	priority_queue <iPair, vector <iPair>, greater<iPair> > pq;

	int src = 0;

	vector<int> key(V, INF);
	vector<int> parent(V, -1);
	vector<bool> inMST(V, false);

	pq.push(make_pair(0, src));
	key[src] = 0;

	while(!pq.empty()) {
		int u = pq.top().second;
		pq.pop();

		inMST[u] = true;

		list< pair<int, int> >::iterator i;
		for (i = adj[u].begin(); i != adj[u].end(); i++) {
			int v = (*i).first;
			int weight = (*i).second;

			if (inMST[v] == false && key[v] > weight) {
				key[v] = weight;
				pq.push(make_pair(key[v], v));
				parent[v] = u;
			}
		}
	}

	for (int i = 0; i < V; i++) {
		totalCost += key[i];
		if (parent[i] != i && i != 0) {
			edges++;
		}
	}

	fout << totalCost << "\n" << edges << "\n";
	for (int i = 1; i < V; i++) {
		fout << parent[i] + 1 << " " << i + 1 << "\n";
	}

	fout.close();
}

int main(int argc, char *argv[]) {
	int n, m, x, y, c;
	std::ifstream fin("apm.in");
	fin >> n >> m;
	Graph g(n);
	for (int i = 0; i < m; i++) {
		fin >> x >> y >> c;
		x--;
		y--;
		g.addEdge(x, y, c);
	}
	fin.close();
	g.primMST();
	return 0;
}