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小希的迷宫,并查集?其实不用并查集;
小希的迷宫 ...
随机推荐
- less新手入门(三) 作为函数使用的Mixin、@import 导入指令 、@import 导入选项
五.作为函数使用的Mixin 从mixin返回变量 在mixin中定义的所有变量都是可见的,并且可以在调用者的作用范围中使用(除非调用者用相同的名称定义它自己的变量). .mixin(){ @widt ...
- [C++ STL] vector使用详解
一.vector介绍: vector(向量): 是一种序列式容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界.而vector正好弥补 ...
- 429c Leha and Function
题目 解题报告 F(n, k)是在集合{1, 2, 3, ..., n}中所有的具有k个元素的子集中分别取最小值,相加后的期望. 例如:要求F(4, 2),根据定义有{1, 2}, {1, 3}, { ...
- 用Movie显示gif(2)GifView
1,类 import android.annotation.SuppressLint; import android.content.Context; import android.content.r ...
- Java 8 (5) Stream 流 - 收集数据
在前面已经使用过collect终端操作了,主要是用来把Stream中的所有元素结合成一个List,在本章中,你会发现collect是一个归约操作,就像reduce一样可以接受各种做法作为参数,将流中的 ...
- VMWare虚拟机中Ubuntu 16.04 (linux无桌面)配置静态IP上网
1. 基础环境说明 虚拟机: VMWare 12.5.2 操作系统: Ubuntu 16.04 (无桌面) 物理主机操作系统: win 7 旗舰版 2. 摸底 VMware在安装之后,会创建2个虚拟的 ...
- sql server truncate table 删除表数据限制条件
truncate 注释 注释TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...
- Erwin 带注释(comment )
1. Database>Pre & Post Script > Model-level %ForEachTable() { alter TABLE %TableName COMME ...
- Flask框架 之重定向、cookie和session
一.URL重定向(redirect) @app.route("/login") def login(): # 使用url_for函数通过视图函数的名字找到url路径 url = u ...
- php切换版本之后 redis 安装使用
一:redis安装Download, extract and compile Redis with: $ wget http://download.redis.io/releases/redis-3. ...