zoj并查集系列

ZOJ:浙江大学程序在线评测系统.docx ZOJ,全称“浙江大学程序在线评测系统”(Zhejiang University Online Judge),是一个提供信息学(算法竞赛)题库及程序评测的网站。以下是关于ZOJ的详细介绍: 一、基本信息 名称:浙江大学程序在线评测系统(ZOJ) 外文名:Zhejiang University Online Judge 始建时间:2002年 平台:构建于Linux平台 语言兼容性:兼容Pascal、C、C++等多种语言 二、系统特点 公益性:ZOJ是一个免费的公益性网上程序设计题库,是国内创办最早的程序在线评测系统之一。 题目来源:题目大部分来自ACM国际大学生程序设计竞赛,以及全球各赛区或著名大学的竞赛试题,总数超过3000道,且均为全英文题目。 竞赛支持:每年5月份左右的浙江省大学生程序设计竞赛在该系统上进行,ZOJ还每月举行月赛,吸引全球程序爱好者参与。 三、功能与服务 实时排名与公布:比赛结果实时排名,在线公布,确保比赛的公平公正。 自动评测:用户可以针对某个题目编写程序并提交,ZOJ会自动判定程序的对错,并在几秒内给出反馈。 教学支持:每个学生可以在ZOJ上建立自己的账号,教 立即下载

zoj系列学习——并查集

题型:

并查集 三步走 查找 合并 压缩


问题描述

zoj2833Friendship
题目简析:
已知N个人 M条指令,有两种操作M(朋友关系)Q(查询)
比较典型的并查集问题。
该问题已经提示要用scanf 和 printf了

没有ac的代码,说是超时问题

#include <iostream>
#include<stdio.h>
#include<cmath>
#include <string.h>
using namespace std;

int root_set[100005];

int getroot(int root_set[], int num)
{
	while (root_set[num] >= 0)
	{
		num = root_set[num];
	}

	return num;
}

void Union(int* root_set, int a, int b)
{
	int root1 = getroot(root_set, a);
	int root2 = getroot(root_set, b);
	if (root1 != root2)
	{
		root_set[root1] = root_set[root1] + root_set[root2];//因为是负数
		root_set[root2] = root1;//相当于合并了 
	}
	return;
}

int getfriends(int* root_set, int a)
{
	int root = getroot(root_set, a);
	int num = abs(root_set[root]);
	return num;
}

int main()
{
	int N, M; char ch; int num = 0; int a, b, fre;
	while (scanf("%d%d", &N, & M) != EOF)
	{
		
		memset(root_set, -1, 100005);
		if (num)printf("\n");

		num++;
		getchar();
		printf("Case %d:\n", num);
		for (int i = 0; i < M; i++)
		{
			scanf("%c", &ch);
			getchar();
			if (ch == 'M')
			{

				scanf("%d%d", &a, &b);
				Union(root_set, a, b);
			}
			else {
				scanf("%d", &fre);
				
				int root = getroot(root_set, fre);
				getchar();
				printf("%d\n", abs(root_set[root]));
			}

		}


	}

	return 0;
}

原因分析:

改进:通过坍塌规则进行算法改进(在查找函数里面添加)

//重新构造
//first是一开始查找的数
	while (root_set[first]>=0)
	{
		int temp = root_set[first];
		root_set[first] = num;//此时num是父节点
		first = temp;
	}

但是解决完这个超时问题后,发现还是wrong了几次answer。
经过查找,发现是memset函数问题。
memset 函数用来对一段内存空间全部设置为某个字符,一般可以对数组初始化。
错误用法:

int root_set[100005];
memset(root_set, -1, 100005);

改进:
void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

    memset(root_set, -1, 4*100005);因为是int 是4个字节
 
   	memset(root_set, -1,sizeof(root_set));

getchar()用法

参考:https://www.cnblogs.com/ngnetboy/archive/2012/11/06/2756534.html
getchar()只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符.


问题描述

zoj1789 The Suspects
题目简析:
SARS病毒,问和0号病人一组有多少人。

比较简单

#include <iostream>
#include<stdio.h>
#include<cmath>
#include <string.h>
using namespace std;

int root_set[30002];

int getroot( int num)
{
	int first = num;
	//找到所有的父节点
	while (root_set[num] >= 0)
	{
		num = root_set[num];
	}

	//重新构造
	while (root_set[first]>=0)
	{
		int temp = root_set[first];
		root_set[first] = num;
		first = temp;
	}
	return num;
}

void Union( int a, int b)
{
	int root1 = getroot(a);
	int root2 = getroot(b);
	if (root1 != root2)
	{
		root_set[root1] +=root_set[root2];//因为是负数
		root_set[root2] = root1;//相当于合并了 
	}




	return;
}


int main()
{
	int N, M; 
	while (cin>>N>>M)
	{
		if (N == 0 && M == 0)break;
		
		memset(root_set, -1, sizeof(root_set));
		
		for (int i = 0; i < M; i++)
		{
			int k;
			cin >> k;
			int num; cin >> num;
			for (int t = 1; t < k; t++)
			{
				int num2; cin >> num2;
				Union(num, num2);
			}
		}
		cout << abs(root_set[getroot(0)]) << endl;

	}

	return 0;
}

zoj 源码700题 包含了zoj700多道题目的源代码,在做题时可以参考 立即下载

相关推荐

浙江大学ZOJ题目分类

浙大ZOJ题目分类,可以让你更方便快速锁定那你想要联系的题目,是自己快速提高·

ZOJ贪心算法_题目

ZOJ贪心算法_题目(转) #1117 经典贪心,哈夫曼编码。 #1184 硬币称重,经典,1.若被判平,左右所有球必正常;2.若判轻或判重,对应球被判轻、重记数+1;3.只有球只被判轻或判重,且次数跟天平不平衡次数相等,该球才能是坏的,否则必然是好的。 #1409 求最佳带宽价格比,其中带宽为所有组件的带宽最小值,价格为各个组件价格总和,用贪心即可:记录所有可能的带宽,然后枚举带宽求最优价

稻草人 1992

dxf-viewer 查看器

dxf-viewer SDK 的示例,它是一个基于 Three.js 和 Vue3 构建的基于 WebGL 的 BIM 模型查看器。它用于查看 DWG/DXF/PDF 文件。面积测量 - 角度测量 -标记。

qq_25547755的博客 866

ZOJ刷题指南

题单

Demilly123的博客 2416

数十个锂电池充放电电路,锂电池充放电芯片

关乎锂电池供电的产品,在锂电池上,需要三个电路系统:1,锂电池保护电路,2,锂电池充电电路,3,锂电池输出电路。 内容目录: 单节的锂电池保护电路单节为3.7V锂电池(也叫4.2V)和3.8V锂电池(也叫4.35V) 单节的锂电池充电电路即锂电池保护板 单节的锂电池输出电路锂电池转换稳压输出为:1.2V,3.3V,5V,12V等等 两节的锂电池保护电路两节串联7.4V锂电池(也叫8.4V) 两节的锂电池充电电路即两节锂电池保护板 两节...

kuakewei123的博客 1万+

植物叶绿体基因组分析全攻略:从共线性到密码子偏好性

本文全面解析植物叶绿体基因组分析流程,从共线性分析到密码子偏好性研究。详细介绍了叶绿体基因组结构特征、测序数据获取与质量控制、基因组组装与注释方法,以及比较基因组学和进化分析技术。特别关注IR区边界变异分析和选择压力评估,为植物系统发育研究和物种鉴定提供实用指南。

weixin_28475533的博客 221

zoj - 3261 反向并查集、带权并查集

题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现在发生战争,有一些联系通道会被摧毁,而一些星球会通过还没有被摧毁的联系通道直接或者间接联系能够联系到的武力值最高的星球求救(必须比自己的武力值高),如果有多个武力值都为最高的,那就联系一个编号最小的。现在给出一系列求救和摧毁的序列,一次执行,并对于每一个求救指令寻找合适的求救星球编号,如果没有可以求救的则输出 -1;如我们所知,并查集并不能...

陌离将离 441

SARscape的DInSAR全流程-以西安市隋大兴唐长安城遗址为例

通过DInSAR对西安市隋大兴唐长安城遗址开展的年度周期性监测,发现成因是地质内部构造断裂带活动所导致的地面产生物理空间上的形变,而地面的沉降与抬升是直接影响城市发展与文化遗产保护最为常见的缓变型不可逆地质灾害。西安市地处汾渭断陷盆地中部,受临潼-长安断裂带影响,导致区域内构造活动较为强烈。由于早年西安市地表水资源匮乏,从上世纪50年代末开始大量开采地下水资源以满足城市人口不断扩张的需求,从而导致地下承压含水层水位急速下降,形成多个局部沉降中心(八里村、西工大、电子城等)。

2301_77687129的博客 5815

【并查集】ZOJ1789The Suspects

ZOJ1789The Suspects  The Suspects

Reluxer 543

ThunderScope开源示波器

4CH,1GSa/S 开源示波器。前端很简洁,BUF802+LMH6518,ADC是HMCAD1511,用Xilinx A7 FPGA进行控制,数据通过PCIE总线传输到上位机处理。目前这个项目已经被挂到了Xilinx官网,强。设计日志:https://hackaday.io/project/180090-thunderscope开源地址:https://github.com/EEVengers/ThunderScope。

leida_wt的博客 8190

2025数学建模国赛A题1-4问详解(论文+完整代码)

本文介绍了数学建模国赛A题的解题思路,重点分析了三维遮蔽模型的建立和运动学代码实现。相比第一题,第二题增加了未知参数求解,需要采用遗传算法等非线性优化方法。文章强调该模型由专业团队原创开发,代码可运行,并提醒参赛者警惕市场上的保奖班现象。整体内容聚焦于竞赛解题技巧和原创性保证。

Eloveeeee的博客 2798

zoj3261 带权并查集

题目链接在这里 题目大意 n个星球,每个星球有一个防御值,一共有m条路,连接x星球和y星球。现在发生星际战争了,a星球要寻求帮助,它只能寻求比它的防御值大的星球的帮助(相同的防御值的话取下标较小的那个),其中会破坏道路再进行寻求帮助。问每次询问时,某星球该找哪个星球寻求帮助。 思路 这是一个并查集问题,如果顺着题目的思路来的话,要进行拆边。但是并查集没有拆边的功能,所以我们转换思路,先处理...

Joel 343

华为昇腾云平台适配Baichuan2大模型记录

文件发现报错:ValueError: The pipeline stage 2 in auto_parallel_context is not equal to the pipeline_stage 1 in the config.run_baichuan2_7b.yaml`,发现默认设备数是16卡,对应的pipeline_stage为2,但实际是8卡,那就改成下面的试试看。,将Baichuan2_7B_Chat.ckpt文件复制进去,将。点击镜像管理,突然发现有个2_2_0,赶紧新建了一个,成功。

羊城迷鹿的博客 2393

ZOJ_3261_逆并查集

ZOJ 3261 逆并查集 思路简单代码繁琐一直wa调了一天,真的菜 因为并查集没有摧毁边的操作,那我们不妨先合并所有边中 不会被摧毁的边,那么就需要我们先保存所有的边,(这里太繁琐容易出错) 开一个数组记录每个点的值,因为要找值最大 或者 值相同但点最小的点,在合并的时候根据这个来合并,值小的指向值大的,(值相同时,大点指向小点) 这里用了一个技巧就是 map<pair<int,i...

_llc的博客 195

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

w0shishabi的博客 2923

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

zoj3261:倒序并查集

zoj3261 题解:建议大家先做一下HDU4496,也是倒序并查集 找最大值和最大编号其实也比较简单,代码里Union有,大家应该能看懂。 其它都是一些细节上的处理 代码: #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; #include &lt;set&gt; #include ...

FlyingJack 418

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

逆向并查集(zoj 3261,hdoj 4496)

zoj 3261 Connections in Galaxy War 题目大意: 银河中一些星球之间有通道可以联系,然而另一个维度的怪物将某些联系破坏了。因此当有些星球需要帮助时,就需要判断一下能不能找到一个直接或间接联系的星球,并且这个星球的力量是与该星球连接的所有星球中最大的。如果有这么一个星球,则输出该星球的编号,如果有多个星球是最大的,输出编号最小的那个。如果找不到这样的星球,则输出“-1...

qq_18873031的博客 374

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

并查集确认图的连通性_欧拉路径 ZOJ4127

ZOJ4127 题目链接在此! 题目大意: m*n的矩阵,给一个格子都给了一个方向和步数,指向另一个格子。问能否从某个格子开始,按照给的方向和步数,走遍所有的格子。 就是求能否一笔走完所有的格子。 思路过程: 首先! 一笔走完就两种情况: 一条长长的链条! 此时起点的入度比出度小1,终点的入度比出度大1,其余的相等。 一条完整的有向回路! 这时候所有点的出度等于入度。 用欧拉路径,判断所有点的出度入度。 由于这道题目的特殊,出度一定小于等于1。 所以上述两种情况,可以简化为: 入度为0的点的个数为0或者

欧阳小百合 216

zoj2833-并查集

/* zoj2833简单并查集 【题目大意】 朋友的朋友也是朋友 。n是人数,m为操作(M和Q)次数。 1.M a b:a和b做朋友。 2.Q a:查a的朋友数 。 初始时,每个人都是新人,朋友数为1。 */ #include #define NUM 100005 int set[NUM]; int friends[NUM]; int find(int

2006

ZOJ 3261 Connections in Galaxy War 【逆向并查集】

ZOJ 3261 Connections in Galaxy War 题目链接:vjudge传送门 题目大意: 一共有N个星球,每个星球有一定的power值,两个星球之间可以建立联系,当某个星球寻求帮助时,是向与它有直接或间接联系的星球中且power值最大的星球寻求帮助,如果两个星球之间的联系被destory,则这两个星球将失去直接联系,只可能存在间接联系。 具体思路: 完全想不到,还可以离线逆向...

指弹键盘哼民谣 560

J - Welcome Party ZOJ - 4109 并查集 bfs

J - Welcome Party ZOJ - 4109 此处是题面... 思路:并查集分块,然后把每一块编号最小的那个人存在优先队列里,每次把此刻能进入门的人压进优先队列,按取出次序就是答案。 注意:并查集par数组一定用par[i] = i初始化,否则不是爆栈就是T,别问我怎么知道的,md调了半天... AC代码 //include <bits/stdc++.h&...

Focus5679的博客 207

Welcome Party ZOJ - 4109 (思维+并查集)

题目链接: Welcome Party ZOJ - 4109 题目大意:给你T组测试样例,然后n个人,m个关系,每一个关系包括两个人,这两个人为好朋友,然后问你怎么安排顺序,使得整个队伍的友情损失度最小(当一个人放置时,如果他的前面中没有他的朋友,那么整个队伍的朋友损失度就会加1) 具体思路:首先用并查集求出每一个联通块,然后用一个超级汇点连向这些连通块的根,然后优先队列+b...

diaomeijiao3430的博客 260

ZOJ 3321 Circle(并查集)

ZOJ 3321 Circle(并查集) http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3321 题意:        给你一个n节点m条边的无向图,问你该图是否正好是一个环? 分析:        无向图是一个简单环 充要条件是 所以节点的度数==2且图连通.        所以我们只需要记录每个节点的度且用

code 2005

zoj1789-简单并查集

/* zoj1789 【题目大意】 SARS是传染病。 学生x是传染源,与学生x一组都是传染源。 n个学生(序号从0~n-1)分为m组,初始时,0学生是传染源,找出传染源的人数 。 */ #include #define NUM 30001 int set[NUM]; int find(int x) { int r=x; while(r!=set

1115

ZOJ 3261 Connections in Galaxy War 逆向并查集/删边

ZOJ3261 题意:给出n个顶点,每个顶点有对应的能量值,再给出m个顶点对表示初始图的联通情况。 最后给出Q个条件,query表示 查询某个顶点所在集合中能量最大的顶点编号(如果最大能量的顶点有相同则输出序号最小的)。destroy+顶点对表示删除该顶点之间的联通。 思路: 并查集做不到合并完然后删边,所以想到先得到查询数据然后根据删的边逆向并查集,每次删的边变为加上该边,就可以使用合并操作了。既然是逆向离线处理,所以创建初始图的时候如果该边会被删除就不要加入初始图里。 最后是合并操作,题目要.

m0_60777643的博客 419

J - Welcome Party ZOJ - 4109 【 并查集 + 优先队列 + BFS 】

J - Welcome Party ZOJ - 4109 &:这个就是看着题解搞得了,当时想到了优先队列和 BFS ,没有搞把所有的连起来,但是也没有尝试,当时在做字符串那个题,反正各种原因了。言归正传,题目的意思是,给你 n 个人,n 个人有 m 对关系,对于一个人,如果他上场了,发现没有他认识的人,会产生一个值,也就是 ans ++,否则不会产生,问安排上场顺序让 ans 最...

Mercury_Lc的博客 528
BUTTY_LUO
博客等级 码龄6年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值