`
linest
  • 浏览: 155631 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

ZOJ-2833* 交友问题

    博客分类:
  • acm
 
阅读更多
一群人相互交友。M 1 2 代表1和2成为朋友 Q 1 代表查询1的朋友数。

Sample Input

3 5
M 1 2
Q 1
Q 3
M 2 3
Q 2
5 10
M 3 2
Q 4
M 1 2
Q 4
M 3 2
Q 1
M 3 1
Q 5
M 4 2
Q 4


Sample Output

Case 1:
2
1
3

Case 2:
1
1
3
1
4


思路:并查集问题。
#include<iostream>
using namespace std;
#include<memory.h>
#include<stdio.h>

int disjoinset[100001];

int find(int * s,int x)
{
	if(s[x] <= 0)
		return x;
	else
		return s[x] = find(s,s[x]); //path compress
}

void unionbysize(int *s,int root1,int root2)
{
	if(s[root1] <= s[root2]) //root1 is bigger
	{
		s[root1] = s[root1] + s[root2];
		s[root2] = root1;
	}
	else
	{
		s[root2] = s[root1] + s[root2];
		s[root1] = root2;
	}
}

//并查集内容 负数代表个数,正数代表父节点
int main()
{
	int N;
	int M;
	char type;
	int mem1;
	int mem2;
	int root1;
	int root2;
	int i = 0;
	bool isfirst = true;

	while(scanf("%d%d",&N,&M) != EOF)
	{
		memset(disjoinset,-1,100001*sizeof(int));	
		if(!isfirst)
			printf("\n");
		isfirst = false;
		printf("Case %d:\n",++i);
		while(M--)
		{
			getchar(); 
			scanf("%c",&type);
			if(type == 'M')
			{
				scanf("%d%d",&mem1,&mem2);
				root1 = find(disjoinset,mem1);
				root2 = find(disjoinset,mem2);
				if(root1 != root2)
					unionbysize(disjoinset,root1,root2);
			}
			else if(type == 'Q')
			{
				scanf("%d",&mem1);
				root1 = find(disjoinset,mem1);
				printf("%d\n",-disjoinset[root1]);
			}

		}
		
	}
}


分享到:
评论

相关推荐

    ACM算法经典书籍----最全最详细的书籍推荐!

    - **特点**: 本书系统介绍了数值分析的基础理论和方法,对于理解算法中的计算精度等问题非常有用。 - **适用人群**: 适合对数值计算感兴趣的学习者。 - **内容覆盖**: - 插值方法 - 数值积分 - 微分方程数值解法...

    在线判断-算法题

    根据提供的文件信息,本文将对在线...通过这些平台,不仅可以提高编程技能,还能接触到不同类型的算法问题,对于提升个人综合能力非常有帮助。希望每位学习者都能找到最适合自己的平台,在算法的海洋里不断探索与进步。

    Acm竞赛常用算法与数据结构

    - **浙江大学微软技术俱乐部**和**ZOJ**(在线评测系统)是训练和选拔优秀选手的重要平台。 - **参考书籍**:《C++ Primer》、《C++标准程序库》、《算法导论》、《算法艺术与信息学竞赛》等是深入学习的基础资料...

    线段树题目

    - **ZOJ 1610** 和 **POJ 2777**:这两道题都是典型的线段覆盖问题,需要利用线段树来解决。基本思路是通过线段树维护每个区间是否被覆盖的状态。对于每个覆盖请求,更新线段树对应区间中的覆盖状态,并统计完全被...

    欧拉回路题集

    1. **Strange Country II (ZOJ-3332) 竞赛图** - **题目描述**:在一种特殊的图——竞赛图中寻找哈密顿回路。 - **解题思路**:竞赛图中每个节点的入度和出度都为1,因此可以按照顺序构造哈密顿回路。 - **数据...

    acm新手训练方案新手必备

    动态规划是一种重要的算法思想,主要用于解决具有重叠子问题和最优子结构的问题。 - **状态定义**:明确问题的状态空间,定义状态转移方程。 - **状态转移**:确定如何从已知状态转移到目标状态。 - **示例题目**...

    ACM练习题库

    - 解决ZOJ等网站上的难题 - 参加各类在线比赛,体验比赛氛围 - 对已解决的题目进行深入分析,探索更优解法 通过以上训练计划,可以在短时间内迅速提高算法和编程能力,更好地应对各种类型的ACM竞赛。

    OnlineJudge站点网址

    #### 2.2 Zhejiang University ACM Online Judge (ZOJ) - **网址**: http://acm.zju.edu.cn - **特点**: - 由浙江大学维护,题目难度适中,适合练习ACM竞赛题目。 - 界面简洁,易于上手。 #### 2.3 Sichuan ...

    acm 资料大全 程序 设计 竞赛 icpc

    - 经常参与ZOJ等在线评测系统的练习。 - 参加校内或线上的模拟赛。 - 注重团队协作能力的培养。 - 养成良好的编程习惯和调试能力。 #### 四、常见算法与数据结构详解 - **图论**: - 最短路径算法(Floyd、...

    备战ACM资料 DP问题等

    ### 备战ACM资料:DP问题及其他知识点详解 #### ACM概述与背景 ACM (Association for Computing Machinery) 是一个国际计算机科学领域的专业组织,它所举办的编程竞赛(ACM International Collegiate Programming ...

    acm程序设计曾宗根

    ACM国际大学生程序设计竞赛是由ACM(美国计算机协会)主办的一项世界级比赛,旨在评估参赛队伍解决复杂问题的能力、编程技能以及团队合作精神。这项赛事在全球范围内享有极高的声誉,被认为是衡量学生算法设计与实现...

    zoj-cpp.zip_zoj

    【标题】"ZOJ-CPP.zip" 是一个包含ZOJ(在线判题系统ZeroJudge)网站上多个C++编程练习解答的压缩包。这个压缩包的名称表明它专注于C++语言,很可能是一个学习资源,旨在帮助初学者理解和解决动态规划问题。 【描述...

    国际大学生程序设计竞赛指南—ACM程序设计

    - 第三章详细介绍了ACM程序设计中常用的编程技巧,这些技巧对于解决实际问题至关重要。 - 例如,如何有效地使用STL中的容器来存储和管理数据,如何利用特定的算法优化程序的时间复杂度等。 ##### 4. ACM 竞赛题目...

    在线online judge

    - **特点**: POJ相较于ZOJ建立时间稍晚,但题目更新迅速,数量已接近或超过了ZOJ。POJ的特点在于举办在线比赛的频率较高,这对于参赛者来说是一个很好的实战机会。与ZOJ相比,POJ的数据难度略低,但这并不意味着其...

    ZOJ全部题目分类(分得很细哦)

    ### ZOJ全部题目分类详解 #### 一、概述 ZOJ(Zhejiang Online Judge)作为一项在线编程竞赛平台,提供了丰富的算法题目供学习者练习。本文将根据所提供的文件中的“初学者题”、“模拟问题”、“动态规划”及...

Global site tag (gtag.js) - Google Analytics