| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 24152 | Accepted: 8587 |
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!
题目链接:http://poj.org/problem?id=1679
题目大意:n个点m条路,给出每条路以及边权,判断最小生成树是否是唯一的。
解题思路:克鲁斯卡尔,判断是否存在等效边。这题数据太弱了,我判断等效边的方法不太对,居然过了= =
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int fa[102];
struct EG
{
int u,v,w;
}eg[5005];
void get_fa()
{
for(int i=0;i<105;i++)
fa[i]=i;
}
int find (int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void Union(int a,int b)
{
int a1=find(a);
int b1=find(b);
if(a1!=b1)
fa[a1]=b1;
}
int cmp(EG a,EG b)
{
return a.w<b.w;
}
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,ans=0,p=0,cnt=0;
get_fa();
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&eg[i].u,&eg[i].v,&eg[i].w);
}
sort(eg,eg+m,cmp);
for(int i=0;i<m;i++)
{
if(find(eg[i].u)!=find(eg[i].v))//如果当前边需要加入且下一条边也需要加入且它们权值相等即为等效边
{
if(i+1<m&&find(eg[i+1].u)!=find(eg[i+1].v)&&eg[i].w==eg[i+1].w)
{
p=1;
break;
}
Union(eg[i].u,eg[i].v);
ans+=eg[i].w;
cnt++;
}
if(cnt>=n)
break;
}
if(!p)
printf("%d\n",ans );
else
printf("Not Unique!\n");
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 1679 The Unique MST (克鲁斯卡尔)
原文地址:http://blog.csdn.net/criminalcode/article/details/47671481