SOJ 3427 Dark roads

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值