| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 27389 | Accepted: 9816 | 
Description
Input
Output
Sample Input
2 3 3 1 2 1 2 3 2 3 1 3 4 4 1 2 2 2 3 2 3 4 2 4 1 2
Sample Output
3 Not Unique!
Source
原题链接:http://poj.org/problem?id=1679
题意:看最小生成树是否唯一,网上看了好多的代码,都用到了枚举,但是发现了一份不用枚举的代码,
原文链接:http://blog.csdn.net/cambridgeacm/article/details/7857252,但是有一点不明白,就是主循环为什么是n次,而不是n-1次。有大神知道吗?
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int a[105][105];
int dis[105];
bool vis[105];
int n,m;
void Prime()
{
    for(int i=1; i<=n; i++)
    {
        dis[i]=a[1][i];
        vis[i]=false;
    }
    int ans=0;
    bool flag=false;
    for(int i=1; i<=n; i++)
    {
        int minn=INF;
        int p=-1;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&dis[j]<minn)
                minn=dis[p=j];
        }
        int k=0;
        for(int j=1; j<=n; j++)
        {
            if(vis[j]&&a[p][j]==minn)
                k++;
        }
        if(k>1)
        {
            flag=true;
            break;
        }
        vis[p]=1;
        ans+=minn;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&dis[j]>a[p][j])
                dis[j]=a[p][j];
        }
    }
    if(flag)
        cout<<"Not Unique!"<<endl;
    else
        cout<<ans<<endl;
}
int main()
{
    int T;
    freopen("data/1679.txt","r",stdin);
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(int i=0; i<=n; i++)
        {
            for(int j=0; j<=n; j++)
                if(i==j) a[i][j]=0;
                else a[i][j]=INF;
        }
        int x,y,z;
        while(m--)
        {
            scanf("%d%d%d",&x,&y,&z);
            if(z<a[x][y])
                a[x][y]=a[y][x]=z;
        }
        Prime();
    }
    return 0;
}
POJ 1679 The Unique MST【MST是否唯一,Prime算法,最好的代码】
原文:http://blog.csdn.net/hurmishine/article/details/52225465