poj 1679 The Unique MST

来源:互联网 发布:网络线材厂家 编辑:程序博客网 时间:2024/06/05 06:36

判断最小生成树是否唯一,只需要判断是否存在至少有两条到达某个点相同权值的路径

#include<stdio.h>#include<string.h>#include<math.h>#include<vector>#include<algorithm>#include<iostream>using namespace std;#define N 110#define LL __int64#define inf 1999999999int dis[N],Map[N][N];bool vis[N];int n,m;void prime(){    int i,j,Min,t;    memset(vis,0,sizeof(vis));    for(i=1;i<=n;i++)        dis[i]=Map[1][i];    dis[1]=0;vis[1]=1;    int ans=0;    for(i=1;i<n;i++)    {        Min=inf,t=0;        for(j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<Min)            {                Min=dis[j];                t=j;            }        }        int k=0;        for(j=1;j<=n;j++)//判断        {            if(Map[j][t]==Min)                k++;        }        if(k>1) break;        vis[t]=1;        ans+=Min;        for(j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]>Map[t][j])                dis[j]=Map[t][j];        }    }    if(i<n)printf("Not Unique!\n");    else printf("%d\n",ans);}int main(){    int i,j,t,u,v,w;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)                Map[i][j]=inf;        }        for(i=1;i<=m;i++)        {            scanf("%d%d%d",&u,&v,&w);            if(Map[u][v]>w)                Map[u][v]=Map[v][u]=w;        }        prime();    }    return 0;}


0 0