hdu 2988(kruskal求最小生成树)
2013-05-31 11:46
507 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2988
思路:水题,kruskal求最小生成树之后,直接用总权值减去即可。
View Code
思路:水题,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
相关文章推荐
- hdu 2988(kruskal求最小生成树)
- HDU 1233 prim kruskal最小生成树
- HDU 1598 find the most comfortable road 【枚举+(并查集)最小生成树Kruskal】
- HDU 2988 Dark roads (裸的最小生成树)
- hdu 1233 还是畅通project(kruskal求最小生成树)
- PAT 5-10 公路村村通 && HDU 1232 Kruskal 最小生成树
- HDU 1102 Constructing Roads(Kruskal最小生成树求最小花费)
- HDU 1301 Jungle Roads (最小生成树)kruskal
- HDU 1875 畅通工程再续(最小生成树 kruskal)
- hdu 1875 最小生成树(kruskal)
- HDU 1879 继续畅通工程(最小生成树-Kruskal)
- hdu 1863(最小生成树kruskal)
- HDU 1233 还是畅通工程(最小生成树Kruskal)
- hdu 1233 还是畅通工程(最小生成树,kruskal,前向星)
- 【最小生成树+kruskal】杭电 hdu 1879 继续畅通工程
- HDU - 1102 Constructing Roads(最小生成树kruskal)
- (最小生成树 Kruskal)HDU 5253 连接的管道
- HDU 1879 继续畅通工程(Kruskal求最小生成树)
- HDU 1301 Jungle Roads (Kruskal求最小生成树)
- hdu 1875 畅通工程再续(最小生成树 kruskal)