ACdream 1135 MST (最小生成树)
2014-07-12 20:18
267 查看
ACdream 1135 MST
题目链接:http://acdream.info/problem?pid=1135
根据L建立最小生成树,在L相同情况下维护C最小。Kruskal 算法一个快排处理之。
AC代码:
题目链接:http://acdream.info/problem?pid=1135
根据L建立最小生成树,在L相同情况下维护C最小。Kruskal 算法一个快排处理之。
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct edge { int x,y,l,c; }; struct edge ed[100010]; int father[10010]; int find(int x) { if(x==father[x]) return x; return father[x]=find(father[x]); } bool cmp(edge a,edge b) { if(a.l!=b.l) return a.l<b.l; if(a.c!=b.c) return a.c<b.c;//在L相同下维护C最小 return false; } void solve(int n,int m) { int fx,fy,i,count=0; int ans1=0,ans2=0; for(i=1;i<=n;i++) father[i]=i; sort(ed,ed+m,cmp); for(i=0;i<m;i++) { fx=find(ed[i].x); fy=find(ed[i].y); if(fx!=fy) { father[fx]=fy; ans1+=ed[i].l; ans2+=ed[i].c; count++; } } if(count==n-1)//是否是一课树。 printf("%d %d\n",ans1,ans2); else printf("-1 -1\n"); } int main () { int n,m; int i,a,b,l,c; while(scanf("%d %d",&n,&m)!=EOF) { for(i=0;i<m;i++) { scanf("%d %d %d %d",&a,&b,&l,&c); ed[i].x=a,ed[i].y=b; ed[i].l=l,ed[i].c=c; } solve(n,m); } return 0; }
相关文章推荐
- ACdream 1135(MST-最小生成树边上2个值,维护第一个最小的前提下让另一个最小)
- ACdream 1135(MST-最小生成树边上2个值,维护第一个最小的前提下让还有一个最小)
- 【并查集 最小生成树两种模板(MST)】
- bzoj 1937: [Shoi2004]Mst 最小生成树 (KM算法)
- The Unique MST ——最小生成树的唯一性
- POJ 1679 The Unique MST(判断最小生成树是否唯一)
- poj 1679 The Unique MST (判断最小生成树是否唯一)
- bzoj 1937: [Shoi2004]Mst 最小生成树
- Prim && Kruskal 生成MST(最小生成树)及最短路径问题
- bzoj1937 [Shoi2004]Mst 最小生成树(KM)
- POJ-1258 Agri-Net 最小生成树(MST)
- POJ1679 The Unique MST(Kruskal)(最小生成树的唯一性)
- poj 1679 The Unique MST(判断最小生成树是否唯一)
- hdu1233 还是畅通工程(MST最小生成树)
- prim算法基础详解(无向赋权图的最小生成树MST)
- 图的最小生成树MST--Kruskal算法
- 对Prim算法求最小生成树(MST)有深入的了解
- POJ 1679 The Unique MST 推断最小生成树是否唯一
- 最小生成树(Minimal Spanning Tree MST)--《算法导论》
- 最小生成树MST-Kruskal算法