简单的并查集小题。
再过两周就NOIP复赛了...
原来什么题都有0ms过的牛人!我的解法15ms
/*
* HDU-1232 畅道工程
* mike-w
* 2011-10-21
* ---------------
* tag: MST? 并查集...
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 1111
int set[SIZE];
int mkset(int n)
{
int i;
for(i=0;i<=n;i++)
set[i]=-1;
return 0;
}
int find(int e)
{
int node,root;
node=e;
while(set[node]>0)
node=set[node];
root=node;
while(set[e]>0)
{
node=set[e];
set[e]=root;
e=node;
}
return root;
}
int merge(int e1, int e2)
{
int r1=find(e1);
int r2=find(e2);
if(r1==r2) return 0;
if(set[r1]>set[r2])
set[r1]=r2;
else if(set[r1]<set[r2])
set[r2]=r1;
else
set[r1]=r2,set[r2]--;
return 1;
}
int main(void)
{
int i,count,N,M,t1,t2;
#ifndef ONLINE_JUDGE
freopen("t.in","r",stdin);
#endif
while(scanf("%d%d",&N,&M)!=EOF && N)
{
count=N-1;
mkset(N);
for(i=0;i<M;i++)
{
scanf("%d%d",&t1,&t2);
if(merge(t1,t2))
count--;
}
printf("%d\n",count);
}
return 0;
}