poj1679 判断最小生成树是不是唯一? 如果让我说:我只能说,实力决定一切。

来源:互联网 发布:js设置div显示 编辑:程序博客网 时间:2024/05/18 12:03

思路:求次小生成树和最小生成树。

#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int inf=1<<30;const int maxn=111;int ans1,ans2;int dis[maxn];int map[maxn][maxn];int iToj[maxn][maxn];int vis[maxn];int use[maxn][maxn];int pre[maxn];int T,N,M;int MAX(int a,int b){    return a>b?a:b;}void init(){    int i,j;    for(i=0; i<=N; i++)    {        for(j=0; j<=N; j++)        {            map[i][j]=inf;            use[i][j]=0;        }        vis[i]=0;    }}int prime(int pox){    int sum=0,i,j;    for(i=1; i<=N; i++)    {        dis[i]=map[pox][i];        pre[i]=1;    }    pre[1]=-1;    vis[1]=1;    int tem=1;    for(i=1; i<N; i++)    {        int MINX=inf;        for(j=1; j<=N; j++)        {            if(!vis[j]&&MINX>dis[j])            {                tem=j;                MINX=dis[j];            }        }        sum+=MINX;        vis[tem]=1;        use[pre[tem]][tem]=use[tem][pre[tem]]=1;        for(j=1; j<=N; j++)        {            if(vis[j])                iToj[j][tem]=MAX(iToj[j][pre[tem]],map[pre[tem]][tem]);        }        for(j=1; j<=N; j++)        {            if(!vis[j]&&dis[j]>map[tem][j])            {                dis[j]=map[tem][j];                pre[j]=tem;            }        }    }    return sum;}int prime1(){    int sum=inf,i,j;    for(i=1; i<=N; i++)        for( j=1; j<=N; j++)            if(use[i][j]!=1&&ans1+map[i][j]-iToj[i][j]<sum)                sum=ans1+map[i][j]-iToj[i][j];    return sum;}int main(){    int a,b,c,i;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&N,&M);        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;        }        ans1=prime(1);        ans2=prime1();        if(ans1==ans2)            printf("Not Unique!\n");        else            printf("%d\n",ans1);    }    return 0;}


原创粉丝点击