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小希的迷宫,并查集?其实不用并查集;
小希的迷宫 ...
随机推荐
- ASP.NET MVC 导出CSV文件
ASP.NET MVC 导出CSV文件.直接贴代码 /// <summary> /// ASP.NET MVC导出CSV文件Demo1 /// </summary> /// ...
- mydatepicker97 日历控件
官方教程: http://www.my97.net/
- video 能播放声音不能播放视频,黑屏
与视频编码格式有关,mp4的视频编码有三种:MPEG4(DivX),MPEG4(Xvid),AVC(H264). 浏览器播放视频的支持有限,MP4格式的视频只支持h.264的视频: 视频编码: AVC ...
- DFS BestCoder Round #49 ($) 1001 Untitled
题目传送门 /* DFS:从大到小取模,因为对比自己大的数取模没意义,可以剪枝.但是我从小到大也过了,可能没啥大数据 */ /************************************* ...
- 403 Frog Jump 青蛙过河
一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中.给定石子的位置列表(用单元格序号升序表示), 请判定 ...
- CF868B Race Against Time
思路: 模拟.少写了一个等号FST了,好气啊. 实现: #include <bits/stdc++.h> using namespace std; int main() { int h, ...
- 判断IE浏览器的类型以及提示信息(低版本浏览器不予显示)
//浏览器IE版本判断(function(window) { var theUA = window.navigator.userAgent.toLowerCase(); if ((theU ...
- Android集成微信分享功能应用签名生成方法及分享不生效的问题
通过友盟sdk集成微博.微信.qq等分享功能时,微博和qq很顺利,但在做微信集成时一直不成功.主要问题还是之前在微信开放平台申请创建移动应用时,对应用签名没有填写对,走了很多弯路现总结出来,加深记忆避 ...
- HTML——meta
http://www.cnblogs.com/jr1993/p/4542862.html
- DeepCloneObjects 和 DeepClone
ARX AcDbDatabase 中的方法 deepCloneObjects() 和 wblock() 区别以及和 AcDbObject 方法 clone() 和 deepClone() 的关系 Ac ...