A1. 道路修建 Small(BNUOJ)
A1. 道路修建 Small
64-bit integer IO format: %lld Java class name: Main
无向图初始有个点,从到依次标号,但是没有边,
接下来有次操作,从到依次标号,你需要对每种操作输出相应的结果,操作分为两种:
输入格式 |
操作说明 |
输出结果 |
0_u_v |
加入一条连接标号为和标号为的点的边。 |
输出加边后图中连通块的个数。 |
1_u_v |
查询标号为和标号为的点之间是否连通。 |
如果连通,输出,表示最早在第次操作后标号为和标号为的点之间连通,否则输出。 |
(输入格式中的下划线‘_’表示实际输入文件中的空格)
Input
第一行是一个正整数,表示测试数据的组数,
对于每组测试数据,
第一行包含两个整数、,
接下来行,每行是个整数、、,请注意所给的、均是经过加密的,
解密方式是、 ,其中表示上一次操作的输出结果,
初始,保证,解密后且。
Output
对于每组测试数据,
输出行,每行包含一个整数,表示操作的输出结果。
Sample Input
1 4 7 0 1 2 1 1 0 0 1 3 0 0 1 1 0 1 0 1 7 1 0 5
Sample Output
3 0 2 2 3 1 6
思路:并查级。
用并查集判断有几个联通块。然后每次加点的时候将不同的两个集合合并到一起时,每个集合里的点相连通的时间最早时间就是此时合并的时间,开个yy数组记录就行了。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<math.h> 6 #include<iostream> 7 #include<vector> 8 #include<cstdio> 9 #define sc(x) scanf("%I64d",&x) 10 #define pr(x) printf("%I64d",x) 11 #define prr(x) printf(" %I64d",x) 12 #define prrr(x) printf("%I64d\n",x) 13 typedef long long ll; 14 const ll N=1e9+7; 15 using namespace std ; 16 vector<int>aa[1005];//记录集合中的点 17 int bb[10005]; 18 int dd[10005]; 19 int cc[10005];//并差集权重数组 20 int gg[10005]; 21 int yy[1005][1005];//记录最早联通的时间 22 int main(void) 23 { 24 int i,j,k,p,q,n,m,s; 25 scanf("%d",&k); 26 while(k--) 27 { 28 for(i=0; i<1005; i++) 29 { 30 aa[i].clear(); 31 aa[i].push_back(i);//先将自己加入集合 32 bb[i]=i; 33 cc[i]=1; 34 } 35 scanf("%d %d",&n,&m); 36 memset(yy,0,sizeof(yy)); 37 int nn=0;//初始化输出 38 int ans=0; 39 for(i=1; i<=m; i++) 40 { 41 scanf("%d %d %d",&s,&p,&q); 42 p=p^nn; 43 q=q^nn; 44 if(s==0) 45 { 46 int x,y; 47 for(x=p; bb[x]!=x;) 48 { 49 x=bb[x]; 50 } 51 for(y=q; bb[y]!=y;) 52 { 53 y=bb[y]; 54 } 55 if(x!=y) 56 { 57 yy[p][q]=i; 58 yy[q][p]=i; 59 60 for(j=0; j<aa[x].size(); j++) 61 { 62 for(int r=0; r<aa[y].size(); r++) 63 { 64 yy[aa[x][j]][aa[y][r]]=yy[aa[y][r]][aa[x][j]]=i; 65 66 } 67 }//记录联通最早的时间,因为他们在此时刚和并 68 yy[x][y]=i; 69 yy[y][x]=i; 70 if(cc[x]>cc[y])//合并集合 71 { 72 cc[x]+=cc[y]; 73 bb[y]=x; 74 for(j=0; j<aa[y].size(); j++) 75 { 76 aa[x].push_back(aa[y][j]); 77 } 78 aa[x].push_back(y); 79 aa[y].clear(); 80 81 } 82 else 83 { 84 cc[y]+=cc[x]; 85 bb[x]=y; 86 for(j=0; j<aa[x].size(); j++) 87 { 88 aa[y].push_back(aa[x][j]); 89 } 90 aa[y].push_back(x); 91 aa[x].clear(); 92 93 } 94 } 95 int gh; 96 for(int w=1; w<=n; w++) 97 { 98 for( gh=w; bb[gh]!=gh;) 99 {100 gh=bb[gh];101 }102 gg[w]=gh;103 }104 sort(gg+1,gg+1+n);//判断联通段105 int cnt=1;106 for(int h=2; h<=n; h++)107 {108 if(gg[h]!=gg[h-1])109 {110 cnt++;111 }112 }113 114 nn=cnt;115 printf("%d\n",cnt);116 }117 else if(s==1)118 {119 printf("%d\n",yy[p][q]);120 nn=yy[p][q];121 }122 }123 124 }125 return 0;126 }
A1. 道路修建 Small(BNUOJ)的更多相关文章
- quailty's Contest #1 A1 道路修建 Small
暴力.每次合并两个点之后,把新产生的连通关系都记录下来. #include<cstdio> #include<algorithm> #include<vector> ...
- 道路修建 2(自创题+题解)(From NOI2011)
道路修建这道题想来各位不陌生(传送门在此——Bzoj2435),看了此题,一开始以为是最初各个点处于分散状态,然后做了一下,直到发现标程都有点问题,才发现原题是说本来各点已经处于连接完毕的状态(phi ...
- 【BZOJ-2435】道路修建 (树形DP?)DFS
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3115 Solved: 1002[Submit][Statu ...
- 【bzoj2435】[NOI2011]道路修建
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...
- 【NOI2011】道路修建 BFS
[NOI2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建 ...
- 【BZOJ】2435: [Noi2011]道路修建(树形dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2435 我怎么感觉那么水.. 坑的是,dfs会爆...好吧..用bfs.. //upd:我的智商也是醉 ...
- bzoj 2435: [Noi2011]道路修建 树上 dp
2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- 2435: [Noi2011]道路修建 - BZOJ
Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. ...
- NOI2011道路修建
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1974 Solved: 550[Submit][Status ...
随机推荐
- 基于python win32setpixel api 实现计算机图形学相关操作
最近读研期间上了计算机可视化的课,老师也对计算机图形学的实现布置了相关的作业.虽然我没有系统地学过图形可视化的课,但是我之前逆向过一些游戏引擎,除了保护驱动之外,因为要做透视,接触过一些计算机图形学的 ...
- 零基础学习java------day12------数组高级(选择排序,冒泡排序,二分查找),API(Arrays工具类,包装类,BigInteger等数据类型,Math包)
0.数组高级 (1)选择排序 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的起始位置 ...
- const与指针的三种形式
使用指针时涉及到两个对象:该指针本身和被它所指的对象. 将一个指针的声明用const"预先固定"将使那个对象而不是使这个指针成为常量.要将指针本身而不是被指对象声明为常量,必须使用 ...
- 转Android service 启动篇之 startForegroundService
本文转自:https://blog.csdn.net/shift_wwx/article/details/82496447 前言: 在官方文档 Android 8.0 行为变更 中有这样一段话: An ...
- OSGI与Spring结合开发web工程
简介: 作为一个新的事实上的工业标准,OSGi 已经受到了广泛的关注, 其面向服务(接口)的基本思想和动态模块部署的能力, 是企业级应用长期以来一直追求的目标.Spring 是一个著名的 轻量级 J2 ...
- oracle体系结构(图)
- vueAPI (data,props,methods,watch,computed,template,render)
data Vue 实例的数据对象.Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化.实例创建之后,可以通过vm.$data来访问原始数据 ...
- 在html页面通过绝对地址显示图片
1.编辑tomcat中conf目录下的server.xml文件,在<Host></Host>中添加如下代码段 <Context path="/D" d ...
- 【力扣】两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2: 输入:nums1 = [4,9,5], nu ...
- SQL 基础知识终极指南
什么是数据库? 数据库是以电子方式从系统中存储和检索的大量数据集合. 存储在数据库中的结构化数据被处理.操纵.控制和更新以执行各种操作. 行业中使用的一些流行数据库是 Oracle.MySQL.Pos ...