POJ - 1679 The Unique MST

代码如下:
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;
int f[105];
int get(int x)
{
if(x == f[x]) return x;
return f[x] = get(f[x]);
}
void merget(int x, int y)
{
f[get(x)] = get(y);
}
struct edge
{
int f, t, l;
edge(){}
edge(int ff, int tt, int ll){f = ff, t = tt, l = ll;}
friend bool operator <(edge a, edge b)
{
return a.l < b.l;
}
}e[10005 << 1];
int head[105], now;
void addEdge(int ff, int tt, int ll)
{
e[now ++ ] = edge(ff, tt, ll);
}
int n, m, t;
int main(){
scanf("%d", &t);
while(t -- )
{
scanf("%d%d", &n, &m);
for(int i = 0; i <= n; i ++ ) f[i] = i;
memset(head, -1, sizeof head);
now = 0;
int ans = 0;
bool extra = false;
for(int i = 0; i < m; i ++ )
{
int ff, tt, ll;
scanf("%d%d%d", &ff, &tt, &ll);
if(ff != tt) addEdge(ff, tt, ll);
}
sort(e, e + now);
for(int i = 0; i < now;)
{
int cur = i, conet1 = 0, conet2 = 0;
if(! extra)
while(cur < now && e[cur].l == e[i].l)
{
if(get(e[cur].f) != get(e[cur].t)) conet1 ++ ;
cur ++ ;
}
cur = i;
while(cur < now && e[cur].l == e[i].l)
{
if(get(e[cur].f) != get(e[cur].t))
{
conet2 ++ ;
merget(e[cur].f, e[cur].t);
ans += e[cur].l;
}
cur ++ ;
}
if(conet1 != conet2) extra = true;
i = cur;
}
if(extra) printf("Not Unique!\n");
else printf("%d\n", ans);
}
system("pause");
return 0;
}