原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=2988
简单的水题,为什么不用prim,prim是从点搜索,kruskal是边搜索,后者适合稀疏图。
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int f[200005];
struct Edge
{
int u, v, w;
Edge() {}
Edge(int uu, int vv, int ww) :u(uu), v(vv), w(ww) {}
bool operator < (const Edge &e)const
{
return this->w < e.w;
}
};
int find(int x)
{
if (x == f[x])
return x;
else
return f[x] = find(f[x]);//这里必须这么写,不然超时,降低并查集高度,所以写程序啊,要往最好的算法去写
}
int main()
{
vector<Edge> ve;
int u, v, w;
int n, m;
while (scanf("%d%d", &n, &m), n || m)
{
ve.resize(m);
int ans = 0;
for (int i = 0; i < n; i++)
{
f[i] = i;
}
while (m--)
{
scanf("%d%d%d", &u, &v, &w);
ans += w;
ve[m]=Edge(u, v, w);
}
sort(ve.begin(), ve.end());
for (vector<Edge>::iterator itr = ve.begin(); itr != ve.end(); ++itr)
{
int fu = find((*itr).u), fv = find((*itr).v);
if (fu != fv)
{
f[fu] = fv;
ans -= (*itr).w;
}
}
printf("%d\n", ans);
}
return 0;
}