上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。 
 

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 - 小希的迷宫 并查集的更多相关文章

  1. HDU 1272 小希的迷宫 并查集

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. hdu 1257 小希的迷宫 并查集

    小希的迷宫 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1272 D ...

  3. <hdu - 1272> 小希的迷宫 并查集问题 (注意特殊情况)

     本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 Problem Description: 上次Gardon的迷宫城堡小希玩了很久(见Probl ...

  4. hdu1272 小希的迷宫(并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目: 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...

  5. HDU1272小希的迷宫–并查集

    上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...

  6. TZOJ 2648 小希的迷宫(并查集)

    描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道 ...

  7. hdu-1272 小希的迷宫---并查集或者DFS

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目大意: Problem Description 上次Gardon的迷宫城堡小希玩了很久(见 ...

  8. HDU - 1272 小希的迷宫 并查集判断无向环及连通问题 树的性质

    小希的迷宫 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一 ...

  9. HDU-1272小希的迷宫,并查集?其实不用并查集;

    小希的迷宫                                                                                               ...

随机推荐

  1. Linux学习笔记之Linux常用命令剖析-cat/chmod/cd

    1.cat:用于连接文件并打印到标准输出设备上.(使用权限:所有使用者) 语法格式:cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 ...

  2. Python中re操作正则表达式

    在python中使用正则表达式 1.转义符 正则表达式中的转义: '\('表示匹配小括号 [()+*/?&.] 在字符组中一些特殊的字符会现出原形 所有的\s\d\w\S\D\W\n\t都表示 ...

  3. rman 问题

    1. RMAN Repeatedly Fail To Backup Archivelogs with RMAN-20242 Cause: There is a mis-match between th ...

  4. xcode 制作静态库文件(.a)

    参考: http://www.jb51.net/article/37853.htm 摘要: 1. 获取.a文件的信息              lipo -info /Users/pjk1129/De ...

  5. sql剪切数据

    实际项目当中用到的案例,个人笔记. USE [CA-SM]GO/****** Object:  StoredProcedure [dbo].[PG_SM_AddSum]    Script Date: ...

  6. 使用脚本快速线程转储及列出高cpu线程

    jstack `ps -ef | grep java | grep bocai.jar | awk '{print $2}'` > cpu_high.logtop -b -n1 -Hp `ps ...

  7. h5移动端混编总结

    1.通信机制:解决是否能通信的问题: 2.接口:解决调用会话问题: 3.数据.URL正确性:解决数据.URL跳转路径正确性问题.

  8. js判断是安卓 还是 ios webview?

    通过判断浏览器的userAgent,用正则来判断是否是ios和Android客户端.代码如下: <script type="text/javascript"> var ...

  9. CAD得到指定条件的实体

    主要用到函数说明: IMxDrawSelectionSet::Select2 构造选择集.详细说明如下: 参数 说明 [in] MCAD_McSelect Mode 构造选择集方式 [in] VARI ...

  10. angular4打包以后,刷新报404

    项目打包以后,上传到服务器,可以正常的切换页面,但是一旦刷新就会报404,找不到页面,其解决方法是:在app.module.ts里面引入下面的模块: import {HashLocationStrat ...