题目连接:http://zuojie.3322.org:88/soj/contest/problem.action?cid=279&alias=J
这个题点太多,肯定不能用prim算法进行求解,所以只能用克鲁斯卡尔算法。
以前一直只知道克鲁斯卡尔的算法思想。但是从未动手写过。今天按照思想实现了下,还是挺方便的。
#include<stdio.h> #include<algorithm> using namespace std; int n,m; int father[200005]; struct node { int u; int v; int len; }; node edge[200005]; void init() { int i; for(i=0;i<=n;i++) father[i]=i; } bool cmp(node a,node b) { return a.len<b.len; } int find(int p) { if(father[p]==p) return p; return father[p]=find(father[p]); } int main() { int i,a,b,l,money,x,y,save,ans; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; init(); ans=0,save=0,money=0; for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&l); edge[i].u=a; edge[i].v=b; edge[i].len=l; money=money+l; } sort(edge+1,edge+1+m,cmp); for(i=1;i<=m;i++) { x=find(edge[i].u); y=find(edge[i].v); if(x!=y) { father[x]=y; ans=ans+edge[i].len; } } save=money-ans; printf("%d\n",save); } return 0; }