poj 1679 prim

来源:互联网 发布:股权投资 知乎 编辑:程序博客网 时间:2024/05/18 03:12

判断最小生成树唯不唯一

根据prim算法,找出最小的那条边<v,u>及点u,然后看看已属于T集合的有没有到达点u的距离和此最小边一样长,若有而且还不是点v,那么就证明有其他最小生成树.



#include<stdio.h>#define MX 100000000int cas,n,m,pre[110],dist[110],map[110][110];int prim(int v0){for(int i=1;i<=n;i++){pre[i]=v0;dist[i]=map[v0][i];}pre[v0]=-1;int sum=0;for(int i=1;i<n;i++){int min=MX,u=-1;for(int j=1;j<=n;j++)if(pre[j]!=-1&&dist[j]<min){min=dist[j];u=j;}for(int j=1;j<=n;j++)if(pre[j]==-1&&map[j][u]==min&&j!=pre[u]){return -1;}pre[u]=-1;sum+=min;for(int i=1;i<=n;i++)if(map[u][i]<dist[i]&&pre[i]!=-1){pre[i]=u;dist[i]=map[u][i];}}return sum;}int main(){scanf("%d",&cas);while(cas--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=MX;for(int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);map[a][b]=map[b][a]=c;}int k=prim(1);if(k==-1)printf("Not Unique!\n");elseprintf("%d\n",k);}return 0;}


原创粉丝点击