poj 1679 The Unique MST

来源:互联网 发布:java多线程并发视频 编辑:程序博客网 时间:2024/06/05 01:50

链接:点击打开链接

题意是:求最小生成树,若不唯一则输出'Not Unique!'.。否则输出那个最小权值和。用prime算法,设一个v[]数组,初值0;每次找到的点的放进集合中厚v[i]为1,在求集合到某点的最小距离若有两条边到该点的距离都是那个最小距离则v[]标记为2。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;#define INF 0x7f7f7f7fint edge[105][105],len;int nn,vis[105],m;void prime(int x){ int i,j,k; int mark[105],mi_n; int sum_i; memset(vis,0,sizeof(vis)); for(i=1;i<=nn;i++)  mark[i]=edge[x][i]; vis[x]=1; sum_i=0; for(i=1;i<=nn;i++){   mi_n=INF;   for(j=1;j<=nn;j++){    if(mark[j]<mi_n){    mi_n=mark[j];    k=j;    }   }   if(mi_n==INF)   break;   if(vis[k]==2){   printf("Not Unique!\n");   return;   }   vis[k]=1;   mark[k]=INF;   sum_i+=mi_n;   for(j=1;j<=nn;j++){    if(vis[j]!=1&&edge[k][j]<=mark[j]&&edge[k][j]!=INF){    if(edge[k][j]<mark[j]){    mark[j]=edge[k][j];    vis[j]=0;    }    else    vis[j]=2;    }   } } printf("%d\n",sum_i);}int main(){ int i,j,x,y,z,t; scanf("%d",&t); while(t--){    scanf("%d %d",&nn,&m);    for(i=1;i<=nn;i++)    for(j=1;j<=nn;j++)    edge[i][j]=INF;    for(i=1;i<=m;i++){    scanf("%d %d %d",&x,&y,&z);    edge[x][y]=edge[y][x]=z;    }    prime(1); } return 0;}


原创粉丝点击