Pagini recente » Cod sursa (job #2879785) | Cod sursa (job #2257880) | Cod sursa (job #1131782) | Cod sursa (job #564251) | Cod sursa (job #2094487)
#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;
}