POJ 1287
Kruskal模板题,需要注意,这道题空间限制很严格,第一遍下意识的开了一个记录数组(因为一对节点之间允许多条路经,这里想着进行优化,不过弄巧成拙了,遇到了第一个MLE)
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
#include <map>
#include <set>
using namespace std;
const int maxp= 55;
const int maxr= 1250;
struct Edge
{
int u, v, c;
Edge(int _u= 0, int _v= 0, int _c= 0) : u(_u), v(_v), c(_c) {}
bool operator < (const Edge &rhs) const
{
return c< rhs.c;
}
};
Edge G[maxr];
int fa[maxp];
void AddEdge(int i, int u, int v, int c)
{
G[i]= Edge(u, v, c);
}
int Find(int x)
{
if (x== fa[x]){
return x;
}
return fa[x]= Find(fa[x]);
}
int Kruskal(int n, int m)
{
sort(G, G+m);
int cnt= n, ans= 0;
for (int i= 0; i< m; ++i){
int u= G[i].u, v= G[i].v;
if (Find(u)== Find(v)){
continue;
}
ans+= G[i].c;
fa[fa[u]]= fa[fa[v]];
if (1== --cnt){
break;
}
}
return cnt > 1 ? -1 : ans;
}
int main(int argc, char const *argv[])
{
int p, r;
int u, v, c;
while (~scanf("%d", &p) && p){
scanf("%d", &r);
for (int i= 1; i<= p; ++i){
fa[i]= i;
}
for (int i= 0; i< r; ++i){
scanf("%d %d %d", &u, &v, &c);
AddEdge(i, u, v, c);
}
printf("%d\n", Kruskal(p, r));
}
return 0;
}