首页 > 其他 > 详细

团伙(group)

时间:2014-03-12 14:45:24      阅读:719      评论:0      收藏:0      [点我收藏+]
题目描述
  在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:
      1、我朋友的朋友是我的朋友;
      2、我敌人的敌人是我的朋友;
  所有是朋友的人组成一个团伙。告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?
输入格式
  第1行为n和m,1<n<1000,1<=m<=100 000;
  以下m行,每行为p x y,p的值为0或1,p为0时,表示x和y是朋友,p为1时,表示x和y是敌人。
输出
  一个整数,表示这n个人最多可能有几个团伙。
样例输入
6 4
1 1 4
0 3 5
0 4 6
1 1 2
样例输出

3

分析典型的并查集,具体细节看注解

数据与题解

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m;
int a[1001][1001],father[1001];//a[i][j]存储第i个人的第j个敌人
int find(int);
void merge(int,int);
int find(int);
void work();
int main()
{
	work();
	return 0;
} 
void work()
{
	memset(a,0,sizeof(a));
	cin>>n>>m;
	for(int i=1;i<=n;i++) father[i]=i;//初始化为自己	
	int p,x,y;
	for(int i=1;i<=m;i++)
	{
		cin>>p>>x>>y;
		if(p==0) merge(x,y);//如果x,y是亲戚,则合并 
		if(p==1)//如果x,y是敌人,则把x并入y的所以敌人中,y并入x的敌人中 
		{
			for(int j=1;j<=a[x][0];j++) merge(y,a[x][j]);			
			for(int j=1;j<=a[y][0];j++) merge(x,a[y][j]);
			a[y][0]++;a[y][a[y][0]]=x;//a[x][0]记录的x的敌人数 
			a[x][0]++;a[x][a[x][0]]=y;
		}
	}	
	int tot=0;//入果自己就是树的根表明是一个集合 
	for(int i=1;i<=n;i++) if(father[i]==i) tot++;
	cout<<tot<<endl;
}
void merge(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x!=y)father[x]=y;
}
int find(int x)
{
	if(father[x]==x) return x;
	father[x]=find(father[x]);
	return father[x];
}


团伙(group),布布扣,bubuko.com

团伙(group)

原文:http://blog.csdn.net/hbhszxyb/article/details/21083901

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!