M - 小希的迷宫 并查集
Input输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。
整个文件以两个-1结尾。
Output对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。
Sample Input
6 8 5 3 5 2 6 4
5 6 0 0 8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0 3 8 6 8 6 4
5 3 5 6 5 2 0 0 -1 -1
Sample Output
Yes
Yes
No
一开始的思路,用set记录超时了,这是一开始的解法
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#include<iomanip>
#include<iostream>
using namespace std;
#define MAXN 100008
#define INF 0x3f3f3f3f
typedef long long LL;
/*
当试图加入的两个元素在同一并查集,有多条路
*/
int pre[MAXN];
set<int> s;
int find(int x)
{
if(pre[x]==-)
return x;
return pre[x] = find(pre[x]);
}
bool mix(int x,int y)
{
int fx = find(x),fy=find(y);
if(fx==fy)
return false;
pre[fy] = fx;
return true;
}
int main()
{
int x,y;
bool f=false;
memset(pre,-,sizeof(pre));
while(scanf("%d%d",&x,&y))
{
if(x==-&&y==-)
break;
if(x==&&y==)
{
if(!f)
{
set<int>::iterator it = s.begin();
int tmp = find(*it);
it++;
for(it;it!=s.end();it++)
{
if(find(*it)!=tmp)
{
f = true;
break;
}
}
}
if(f) cout<<"No\n";
else cout<<"Yes\n";
memset(pre,-,sizeof(pre));
s.clear();
f = false;
continue;
}
s.insert(x);
s.insert(y);
if(!mix(x,y))
f = true;
}
return ;
}
后来发现可以用数组记录出现过的数字,然后遍历所有数字,如果其中出现两个不同的pre[i]那么说明图不联通,冲突判断用并查集权值判断
#include<stdio.h>
#include<string.h> const int MAXN=;
int F[MAXN];//存储树根
int t[MAXN];//把出现的数都存入这个数组
int q[MAXN];//标记有没有出现过的数 int find(int x)//查找树根
{
if(F[x]==) return x;
return F[x]=find(F[x]);
} int main()
{
int cnt;
int a,b;
bool flag;
while(scanf("%d%d",&a,&b))
{
if(a==-&&b==-) break; //这个一定要加上去。。。。否则 WR了
if(a==&&b==)
{
printf("Yes\n");
continue;
} memset(F,,sizeof(F));
memset(q,,sizeof(q));
cnt=;
F[a]=b;
if(q[a]==)
{
q[a]=;
t[cnt++]=a;
}
if(q[b]==)
{
q[b]=;
t[cnt++]=b;
} flag=true;
while(scanf("%d%d",&a,&b))
{
if(a==&&b==) break; if(flag==false)continue; int t1=find(a);
int t2=find(b);
if(t1==t2)
{
flag=false;
continue;
}
else F[t1]=t2;
if(q[a]==)
{
q[a]=;
t[cnt++]=a;
}
if(q[b]==)
{
q[b]=;
t[cnt++]=b;
}
}
if(flag)
{
int temp=;
for(int i=;i<cnt;i++)
{
if(F[t[i]]==) temp++;
}
if(temp>) flag=false; }
if(flag) printf("Yes\n");
else printf("No\n");
}
return ; }
M - 小希的迷宫 并查集的更多相关文章
- HDU 1272 小希的迷宫 并查集
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu 1257 小希的迷宫 并查集
小希的迷宫 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1272 D ...
- <hdu - 1272> 小希的迷宫 并查集问题 (注意特殊情况)
本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 Problem Description: 上次Gardon的迷宫城堡小希玩了很久(见Probl ...
- hdu1272 小希的迷宫(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目: 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU1272小希的迷宫–并查集
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...
- TZOJ 2648 小希的迷宫(并查集)
描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道 ...
- hdu-1272 小希的迷宫---并查集或者DFS
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目大意: Problem Description 上次Gardon的迷宫城堡小希玩了很久(见 ...
- HDU - 1272 小希的迷宫 并查集判断无向环及连通问题 树的性质
小希的迷宫 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一 ...
- HDU-1272小希的迷宫,并查集?其实不用并查集;
小希的迷宫 ...
随机推荐
- [C++ 多线程] 学习前瞻
1 多线程是什么? 1.1 多线程的概念? 说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程. 进程可以简单的理解为一个可以独立运行的程序单位,它是线程的集合,进程就是有一个或多 ...
- DFS(连通块) HDU 1241 Oil Deposits
题目传送门 /* DFS:油田问题,一道经典的DFS求连通块.当初的难题,现在看上去不过如此啊 */ /************************************************ ...
- SPFA+Dinic HDOJ 5294 Tricks Device
题目传送门 /* 题意:一无向图,问至少要割掉几条边破坏最短路,问最多能割掉几条边还能保持最短路 SPFA+Dinic:SPFA求最短路时,用cnt[i]记录到i最少要几条边,第二个答案是m - cn ...
- 为WebSphere Application Server v8.5安装并配置JDK7
IBM WebSphere Application Server v8.5可以同时支持不同版本的JDK共存,并且可以通过命令设置概要文件所使用的JDK版本.WAS8.5默认安装JDK6,如果要使用JD ...
- 400 Nth Digit 第N个数字
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字.注意:n 是正数且在32为整形范围内 ( n < 231).示例 1:输入:3 ...
- JS高级——文件操作
https://www.cnblogs.com/mingmingruyuedlut/archive/2011/10/12/2208589.html https://blog.csdn.net/pl16 ...
- vscode常好用的插件以及几个快捷操作
使用方法,可以在官网中搜索需要的插件或者在VsCode的“”扩展“”中搜索需要的插件添加方法使用Ctrl+P, 输入 ext install xxxx ,搜索要安装的插件,点击安装按钮即可(各取所需插 ...
- Java 基础入门随笔(3) JavaSE版——逻辑运算符、位运算符
上一节写了一些运算符的注意事项,这节开头依然是对运算符的一些注意点的阐述! 比较运算符除了>.>=.<.<=.==.!=之外需要注意instanceof:检查是否是类的对象,例 ...
- tomcat 访问IP直接访问项目
apache-tomcat-7.0.52\conf下server.xml文件 <Connector connectionTimeout="20000" port=" ...
- R函数详解
字符串连接函数paste 1.字符串连接:paste(..., sep = " ", collapse = NULL)sep表示分隔符,默认为空格.collapse表示如果不指定值 ...