hdu1863(prim算法)
来源:互联网 发布:阿里云深圳机房 编辑:程序博客网 时间:2024/05/17 20:33
/*made by karen12:00 at Mar.4,2012prim算法求最小生成树奇怪的是Dev c++可以编译但是在Code Blocks里面编译不成功??*/ #include <iostream>#include <cstdio>using namespace std;#define INF 9999999#define MAX_Point 110#define MAX_Edge 12100int arr_list[110][110];struct Edge{ int pointer; int lowcost; int flag;}edge[MAX_Edge];int prim(int n){ int i,j,k=1,flag,min,sum2=0; j=1; for(i=1;i<=n;i++) { if(i!=j) { edge[i].pointer=i; edge[i].lowcost=arr_list[j][i]; edge[i].flag=0; } } edge[j].lowcost=0; edge[j].flag=1; for(i=2;i<=n;i++) { k=1; min=INF; flag=0; for(j=2;j<=n;j++) { if(edge[j].flag==0&&edge[j].lowcost<min) { k=j; min=edge[j].lowcost; flag=1; } } if(!flag) return -1; sum2+=min; edge[k].flag=1; for(j=2;j<=n;j++) { if(edge[j].flag==0&&arr_list[k][j]<edge[j].lowcost) { edge[j].pointer=k; edge[j].lowcost=arr_list[k][j]; } } } return sum2;}int main(){ int n,m,a,b,c,i,j,sum; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0) break; for(i=0;i<110;i++) for(j=i+1;j<110;j++) arr_list[i][j]=arr_list[j][i]=INF; for(i=1;i<=n;i++) { scanf("%d%d%d",&a,&b,&c); if(c<arr_list[a][b]) arr_list[a][b]=arr_list[b][a]=c; } sum=prim(m); if(sum==-1) printf("?\n"); else printf("%d\n",sum); } return 0;}