SOJ 3366 watering hole

来源:互联网 发布:矩阵论第二版课后答案 编辑:程序博客网 时间:2024/04/30 22:55
 

题目连接: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;}