您的位置:首页 > 其它

hdu 2988(kruskal求最小生成树)

2013-05-31 11:46 507 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2988

思路:水题,kruskal求最小生成树之后,直接用总权值减去即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 222222
typedef long long LL;
struct Edge{
int u,v,w;
}edge[MAXN];
LL ans,sum;
int parent[MAXN];
int n,m;

int cmp(const Edge &p,const Edge &q){
return p.w<q.w;
}

int Find(int x){
int s;
for(s=x;parent[s]>=0;s=parent[s])
;
while(s!=x){
int tmp=parent[x];
parent[x]=s;
x=tmp;
}
return s;
}

void Union(int R1,int R2){
int r1=Find(R1),r2=Find(R2);
if(r1==r2)return ;
if(parent[r1]<parent[r2]){
parent[r1]+=parent[r2];
parent[r2]=r1;
}else {
parent[r2]+=parent[r1];
parent[r1]=r2;
}
}

LL Kruskal(){
LL s=0;
for(int i=0;i<m;i++){
int u=edge[i].u,v=edge[i].v,w=edge[i].w;
if(Find(u)!=Find(v)){
s+=w;
Union(u,v);
}
}
return s;
}

int main(){
while(~scanf("%d%d",&n,&m)&&(n+m)){
memset(parent,-1,sizeof(parent[0])*n);
ans=0;
for(int i=0;i<m;i++){
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
ans+=edge[i].w;
}
sort(edge,edge+m,cmp);
sum=Kruskal();
printf("%I64d\n",ans-sum);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: