UVa 10600 ACM contest and Blackout( 次小生成树)
2014-03-12 16:44
495 查看
#include<stdio.h> #include<string.h> #include<algorithm> #define INF 0xffffff #define maxn 105 using namespace std; int f[maxn],ise[maxn],t,n,m; typedef struct { int x,y,w; }Edge; Edge e[maxn]; int find(int x) { if(f[x]!=x) f[x]=find(f[x]); return f[x]; } int cmp(Edge a,Edge b) { return a.w<b.w?1:0; } int kru() { int ans=0,id=0; for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=m;i++) { int f1=find(e[i].x); int f2=find(e[i].y); if(f1!=f2) { f[f1]=f2; ans+=e[i].w; ise[id++]=i; } } return ans; } int kru1(int del) { int ans=0; for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=m;i++) { if(i==del) continue; int f1=find(e[i].x); int f2=find(e[i].y); if(f1!=f2) { f[f1]=f2; ans+=e[i].w; } } return ans; } int main() { //freopen("in.txt","r",stdin); scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w); sort(e+1,e+m+1,cmp); int ans1=kru(),ans2=INF; for(int i=1;i<n-1;i++) { int x=ise[i]; ans2=min(ans2,kru1(x)); } printf("%d %d\n",ans1,ans2); } return 0; }
相关文章推荐
- kuangbin专题八 UVA 10600 ACM Contest and Blackout(次小生成树)
- UVA 10600 ACM Contest and Blackout (次小生成树)
- UVA 10600 ACM Contest and Blackout 次小生成树
- UVA 10600 ACM Contest and Blackout (次小生成树)
- 【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
- uva 10600 ACM Contest and Blackout(次小生成树)
- UVA 10600 - ACM Contest and Blackout(最小生成树&次小生成树)
- uva 10600 - ACM Contest and Blackout(次小生成树)
- UVa 10600__ACM Contest and Blackout(次小生成树)
- UVA 10600 - ACM Contest and Blackout(次小生成树)
- uva 10600 ACM Contest and Blackout (次小生成树)
- ACM Contest and Blackout UVA - 10600 (次小生成树)
- UVA 10600 - ACM Contest and Blackout (次小生成树)
- UVA-10600-ACM Contest and Blackout (次小生成树三种解法)
- UVA 10600 ACM Contest and Blackout 次小生成树/裸
- UVa 10600 ACM contest and Blackout( 次小生成树)
- UVA 10600 ACM Contest and Blackout 次小生成树/裸
- UVA-10600 ACM Contest and Blackout (次小生成树)
- Uva 10600 ACM Contest and Blackout(次小生成树)
- UVa10600 ACM Contest and Blackout(最小和次小生成树)