| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 22715 | Accepted: 8055 |
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!
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 10090
using namespace std;
struct Node
{
int a,b,c;
bool same,used,del;
}f[N];
int n,m;
int fa[N];
int findfa(int x)
{
if(x!=fa[x])
fa[x]=findfa(fa[x]);
return fa[x];
}
void init()
{
for(int i=0;i<200;i++)
fa[i]=i;
}
int cmp(Node a,Node b)
{
return a.c<b.c;
}
bool first;
void make_same(int m)
{
for(int i=1;i<m;i++)
if(f[i].c==f[i-1].c)
f[i-1].same=true;
}
int kruscal(int m)
{
int ans=0;
for(int i=0;i<m;i++)
{
if(f[i].del)continue;
int x=findfa(f[i].a);
int y=findfa(f[i].b);
if(x==y)
continue;
else
{
fa[x]=y;
ans+=f[i].c;
if(first)
f[i].used=true;
}
}
return ans;
}
int main()
{
int ca=1;
scanf("%d",&ca);
while(ca--)
{
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&f[i].a,&f[i].b,&f[i].c);
f[i].del=false;f[i].same=false;f[i].used=false;
}
sort(f,f+m,cmp);
first=true;
init();
int ans1=kruscal(m);
first=false;
make_same(m);
int flag=0;
for(int i=0;i<m;i++)
{
if(f[i].used && f[i].same)//used表示在第一次求出的最小生成树中加入过的边
{//same表示在存在和已加入边权值同样的边,此时标记删除该边在推断是否ans相等
f[i].del=true;
init();
int ans2=kruscal(m);
//cout<<"ans2="<<ans2<<endl;
if(ans1==ans2)
{
puts("Not Unique!");
flag=1;
break;
}
f[i].del=false;
}
}
if(flag==0)
printf("%d\n",ans1);
}
return 0;
}
POJ 1679 The Unique MST 推断最小生成树是否唯一
原文:http://www.cnblogs.com/brucemengbm/p/6844456.html