poj1679判定最小生成树是否唯一

View Code
#include "stdio.h"
#include "string.h"
#define M 110

const int inf = 0x3f3f3f3f; 
int t,n,m;
int g[M][M];

int prim(int ve)
{
    int closest[M];
    int next[M];
    bool useif = false;
    int i,j,v,src=0,nmin;
    for(i=1;i<=n;i++)
    {
        closest[i] = g[ve][i];
        next[i] = ve;
    }
    next[ve] = -1;
    for (i=1;i<n;i++)
    {
        nmin = inf;
        v = -1;
        for(j=1;j<=n;j++)
        {
            if(next[j]!=-1 && closest[j] < nmin)
            {
                nmin = closest[j];
                v = j;
            }
        }
        if(v != -1)
        {
            for(j=1;j<=n;j++)
            {
                if(next[j] == -1 && g[v][j] == nmin && next[v] != j)
                {
                    useif = true;
                }
            }
            if(useif) return -1;
            src += closest[v];
            next[v] = -1;
            for(j=1;j<=n;j++)
            {
                if(next[j]!=-1 && closest[j] > g[v][j])
                {
                    closest[j] = g[v][j];
                    next[j] = v;
                }
            }

        }
        else
        {
            return -1;
        }
    }
    return src;
}

int main()
{
    int i,j,a,b,c,rs;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&m);
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                g[i][j] = inf;
            for(i=0;i<m;i++)
            {
                scanf("%d %d %d",&a,&b,&c);
                g[a][b] = g[b][a] = c;
            }
            rs = prim(1);
            if(rs == -1)
                printf("Not Unique!\n");
            else
                printf("%d\n",rs);
    }
    return 0;
}
posted @ 2012-07-09 15:57  Wheat″  阅读(148)  评论(0)    收藏  举报