标签:
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1254 Accepted Submission(s): 414
2 1 0 1 10 4 0
10 impossible
代码:
Kruskal算法:
#include<stdio.h> #include<algorithm> using namespace std; struct record { int s,e,w; }num[10010]; bool cmp(record a,record b) { return a.w<b.w; } int per[1010]; int m,n; int init() { for(int i=0;i<n;i++) { per[i]=i; } } int find(int x) { int r; r=x; while(r!=per[r]) { r=per[r]; } per[x]=r; return r; } int join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { per[fx]=fy; return true; } return false; } int main() { int i,f,sum; while(scanf("%d%d",&n,&m)!=EOF) { f=1; sum=0; init(); for(i=0;i<m;i++) { scanf("%d%d%d",&num[i].s,&num[i].e,&num[i].w); } sort(num,num+m,cmp); for(i=0;i<m;i++) { if(join(num[i].s,num[i].e)) { sum+=num[i].w; f++; } } if(f!=n) printf("impossible\n\n"); else printf("%d\n\n",sum); } return 0; }
Prim算法:
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f int map[1010][1010],low[1010],vis[1010]; int n,m; int init() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(i==j) map[i][j]=map[j][i]=0; else map[i][j]=map[j][i]=INF; } } } void prim() { int i,j,min,next,sum=0; for(i=0;i<n;i++) { vis[i]=0; low[i]=map[0][i]; } vis[0]=1; for(i=1;i<n;i++) { min=INF; for(j=0;j<n;j++) { if(!vis[j]&&min>low[j]) { min=low[j]; next=j; } } if(min==INF) { printf("impossible\n\n"); return ; } vis[next]=1; sum+=min; for(j=0;j<n;j++) { if(!vis[j]&&low[j]>map[next][j]) { low[j]=map[next][j]; } } } printf("%d\n\n",sum); } int main() { int i,j,a,b,c; while(scanf("%d%d",&n,&m)!=EOF) { init(); for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; } prim(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj 2122 Ice_cream’s world III 【最小生成树】
标签:
原文地址:http://blog.csdn.net/longge33445/article/details/47617977