标签:
| 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