链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213
互相认识的人在安排在同一桌子上,不认识的人,安排在不同的桌子上。可以使用并查集来解决,将这些人归为若干个集合,每个集合中都是相互认识的,每个集合可以选一个代表,即作为该集合中所有人的父节点。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn = 1005 ;
int pre[maxn] ;
void init() ;
void join(int x , int y) ;
int Find_x(int) ;
int test ;
int n ;
int m ;
int main()
{
//freopen("data.in" , "r" , stdin) ;
scanf("%d" , &test) ;
while(test--)
{
scanf("%d%d" , &n , &m) ;
int i ;
int p ;
int q ;
init() ;
for(i = 0 ; i < m ; i ++)
{
scanf("%d%d" , &p , &q) ;
if(Find_x(p)!=Find_x(q))
{
join(p ,q) ;
}
}
int j = 0 ;
for(i = 1 ; i <= n ; i ++)
{
if(pre[i]==i)
{
j++ ;
}
}
printf("%d\n" , j) ;
}
return 0;
}
void init()
{
int i ;
for(i = 1 ; i <= n ; i ++)
{
pre[i] = i ;
}
}
int Find_x(int x)
{
int r = x ;
while(r!=pre[r])
{
r = pre[r] ;
}
int i ;
while(pre[x]!=r)
{
i = pre[x] ;
pre[x] = r ;
x = i ;
}
return r ;
}
void join(int x , int y)
{
int p = pre[x] ;
int q = pre[y] ;
if(p < q)
pre[q] = p ;
else
pre[p] = q ;
}