1. 程式人生 > >poj 1679 The Unique MST

poj 1679 The Unique MST

ews .cn Language bool tracking -m ng-click spa !=

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct data
{
    int u,v,w;
    int same;
    int use;
    int del;
}e[10000+5];

int n,m,bin[1000+5],f;

bool cmp(data a,data b)
{
    return a.w<b.w;
}

int
Find(int x) { int s; for(s=x;bin[s]>=0;s=bin[s]); while(s!=x) { int t=bin[x]; bin[x]=s; x=t; } return s; } void Union(int x1,int x2) { int f1=Find(x1),f2=Find(x2); int t=bin[f1]+bin[f2]; if(bin[f1]>bin[f2]) { bin[f1]=f2; bin[f2]=t; } else
{ bin[f2]=f1; bin[f1]=t; } } int kruskal() { int i,num=0,u,v,ans=0; for(i=0;i<=n+5;i++) bin[i]=-1; for(i=0;i<m;i++) { //printf("%d\n",i); if(e[i].del==1) continue; u=e[i].u; v=e[i].v; if(Find(u)!=Find(v)) { Union(u,v); num++; ans+=e[i].w; if
(f) e[i].use=1; } if(num>=n-1) break; } return ans; } int main() { int _,i,j,k,ans1,ans2; scanf("%d",&_); while(_--) { scanf("%d%d",&n,&m); for(i=0;i<m;i++) { scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w); e[i].u--; e[i].v--; e[i].use=0; e[i].same=0; e[i].del=0; } for(i=0;i<m;i++) for(j=0;j<m;j++) { if(i==j) continue; if(e[i].w==e[j].w) e[i].same=e[j].same=1; } f=1; sort(e,e+m,cmp); ans1=kruskal(); f=0; for(i=0;i<m;i++) { if(e[i].same==1&&e[i].use==1) { e[i].del=1; ans2=kruskal(); if(ans2==ans1) { printf("Not Unique!\n"); break; } e[i].del=0; } } if(i>=m) printf("%d\n",ans1); } return 0; }

poj 1679 The Unique MST