Pagini recente » Cod sursa (job #2757026) | Cod sursa (job #2655979) | Cod sursa (job #364835) | Cod sursa (job #2368846) | Cod sursa (job #1922521)
#include <queue>
#include <fstream>
using namespace std;
struct edge
{
int u, v, d;
};
struct edgeCmp
{
int operator()(const edge& a, const edge &b){ return a.d > b.d; }
};
int find(vector<int> &C, int x)
{
return x == C[x] ? x : find(C,C[x]);
}
void Kruskal(priority_queue <edge, vector<edge>, edgeCmp> &Q, int N)
{
vector<edge> T;
vector<int> C(N);
int weight = 0;
for(int i = 0; i < N + 1;i++) C[i] = i;
while( (int)T.size() < N-1 && !Q.empty() ) {
edge e = Q.top();Q.pop();
int uc = find(C,e.u), vc = find(C,e.v);
if(uc != vc)
{
weight += e.d;
T.push_back(e);
C[uc] = vc;
}
}
ofstream fout("apm.out");
fout<<weight<<"\n"<<T.size()<<"\n";
for(int i = 0; i < (int) T.size();i++)
{
fout<<T[i].v<<" "<<T[i].u<<"\n";
}
}
int main() {
int N, M;
ifstream fin("apm.in");
fin>>N>>M;
priority_queue <edge, vector<edge>, edgeCmp> Q;
for(int i = 0;i< M;i++) {
int n1,n2,cost;
fin>>n1>>n2>>cost;
edge e;
e.u = n1;
e.v = n2;
e.d = cost;
Q.push(e);
}
Kruskal(Q,N);
}