新闻详情

新闻详情

首页 / 资讯中心 / 详情

UVa 793 Network Connections

发布时间:2026/9/2 9:42:58来源:尧图网络
UVa 793 Network Connections
题目描述Bob\texttt{Bob}Bob是网络管理员负责监督计算机网络。他记录网络中计算机之间的连接日志每条连接是双向的。两台计算机相连若它们直接相连或通过其他计算机间接相连。偶尔Bob\texttt{Bob}Bob需要快速判断给定两台计算机是否连通。给定若干条连接操作c i j和查询操作q i j连接操作将计算机iii和jjj连接查询操作询问iii和jjj当前是否连通。要求统计所有查询中成功连通和失败不连通的数量。输入格式第一行为一个正整数表示测试用例个数。随后有一个空行。每个测试用例的第一行为一个正整数nnn表示计算机数量编号111到nnn。随后若干行每行以字符c或q开头后跟两个整数i,ji, ji,j表示连接或查询操作。输入可能包含空行操作行可能以任意顺序出现。每个测试用例的输入以文件结束或遇到非c/q字符结束实际通常以空行结束。输出格式对于每个测试用例输出一行包含两个整数用逗号分隔成功查询数和失败查询数。不同测试用例输出之间用一个空行分隔。样例输入2 10 c 1 5 c 2 7 q 7 1 c 3 9 q 9 6 c 2 5 q 7 5 1 q 1 1 c 1 1 q 1 1样例输出1,2 2,0题目分析本题是典型的动态连通性问题支持添加边和查询连通性。使用并查集Union-Find\texttt{Union-Find}Union-Find数据结构可高效处理。对于每个测试用例初始化nnn个独立集合。对每行输入若为c则合并iii和jjj若为q则检查iii和jjj是否在同一个集合中若相同则成功数加111否则失败数加111。最后输出成功和失败数量。解题思路实现步骤确定如下步骤1\texttt{1}1. 读入测试用例个数casescasescases忽略空行。步骤2\texttt{2}2. 对于每个测试用例读入nnn初始化并查集每个节点自成一集合。步骤3\texttt{3}3. 循环读取行每次先读入一个字符opopop。若opopop为c则读入两个整数i,ji, ji,j合并iii和jjj若opopop为q则读入i,ji, ji,j若find(i)find(j)\texttt{find}(i) \texttt{find}(j)find(i)find(j)则成功数加111否则失败数加111。若opopop既不是c也不是 q$则将该字符放回输入流并跳出循环通常表示空行或文件结束。步骤4\texttt{4}4. 输出当前用例的成功数和失败数以逗号分隔。若还有后续用例输出一个空行。并查集采用路径压缩和按秩合并使查询和合并操作近似常数时间。代码实现// Network Connections// UVa ID: 793// Verdict: Accepted// Submission Date: 2016-11-29// UVa Run Time: 0.020s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;constintMAX_N10010;intparent[MAX_N],ranks[MAX_N];voidmakeSet(){for(inti0;iMAX_N;i){parent[i]i;ranks[i]0;}}// 带路径压缩的查找使用递归实现。intfindSet(intx){return(xparent[x]?x:parent[x]findSet(parent[x]));}// 集合的按秩合并。voidunionSet(intx,inty){xfindSet(x);yfindSet(y);if(xy)return;if(ranks[x]ranks[y])parent[y]x;else{parent[x]y;if(ranks[x]ranks[y])ranks[y];}}intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intcases;cincases;for(intc1;ccases;c){if(c1)cout\n;intn;cinn;makeSet();charform_of_pair;inti,j,success0,failed0;while(cinform_of_pair){if(form_of_pairc||form_of_pairq){cinij;if(form_of_pairc){if(findSet(i)!findSet(j))unionSet(i,j);}else{if(findSet(i)findSet(j))success;elsefailed;}}else{cin.putback(form_of_pair);break;}}coutsuccess,failed\n;}return0;}总结本题通过并查集高效维护动态连通性支持合并和查询操作。使用路径压缩和按秩合并可保证操作接近常数时间适用于较大规模数据。输入处理需注意可能出现的空行和非操作字符通过cin.putback实现回溯。输出格式要求逗号分隔且不同用例间有空行。该解法简洁高效是并查集在连通性问题中的经典应用。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Krokiet 完整指南:免费开源磁盘清理工具,14 种扫描找出重复文件与相似图片 2026/9/2 14:01:43

Krokiet 完整指南:免费开源磁盘清理工具,14 种扫描找出重复文件与相似图片

Krokiet 完整指南:免费开源磁盘清理工具,14 种扫描找出重复文件与相似图片 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka …

阅读更多 →
如何从零构建智能体工具:Hugging Face Agents Course 完整实战指南 2026/9/2 14:01:43

如何从零构建智能体工具:Hugging Face Agents Course 完整实战指南

如何从零构建智能体工具:Hugging Face Agents Course 完整实战指南 【免费下载链接】agents-course This repository contains the Hugging Face Agents Course. 项目地址: https://gitcode.com/GitHub_Trending/ag/agents-course 问模型"今天纽约天气…

阅读更多 →
self-llm transformers 版本冲突:3 步定位匹配版本并修复部署与微调报错 2026/9/2 14:01:43

self-llm transformers 版本冲突:3 步定位匹配版本并修复部署与微调报错

self-llm transformers 版本冲突:3 步定位匹配版本并修复部署与微调报错 【免费下载链接】self-llm 《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多…

阅读更多 →
如何把扫描 PDF 变成可搜索文本:OCRmyPDF 从安装到批量处理完整教程 2026/9/2 14:01:43

如何把扫描 PDF 变成可搜索文本:OCRmyPDF 从安装到批量处理完整教程

如何把扫描 PDF 变成可搜索文本:OCRmyPDF 从安装到批量处理完整教程 【免费下载链接】OCRmyPDF OCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched 项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF OCRmyPDF…

阅读更多 →
按键精灵实战:办公自动化脚本的安装、坐标排查与定时任务 2026/9/2 14:01:43

按键精灵实战:办公自动化脚本的安装、坐标排查与定时任务

按键精灵这类桌面自动化工具,最适合处理的场景是重复、固定、低风险的鼠标键盘操作。很多人一听到“自动化脚本”,首先想到的是游戏、抢票、批量点击,但这些方向很可能违反平台规则,也会把本来很稳定的脚本工具拖进一个容易出问题…

阅读更多 →
STM32与FPGA高速通信:FSMC并行总线设计详解 2026/9/2 13:58:43

STM32与FPGA高速通信:FSMC并行总线设计详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞