小希的迷宫

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 41183    Accepted Submission(s): 12691

Problem Description
上次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

这题比较坑爹。昨天写了一下本地测试都是错误的。然后不想写了,今天中午理了下思路,很顺地写了下来本地测试直接过,花式自信以为能AC,然后抓狂的WA开始了,各种改各种WA。后来发现光拓扑排序是不够的,两个不相连的迷宫也是可以被拓扑排序的。因此还需要并查集。判断题中任意一点是否属于一个集合。然后又WA了一次才过。并查集果然是黑科技。查询的时候就会自动合并。

代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long LL;
const int N=100010;
vector<int>edge[N];
map<int,int>deg;
int pre[N];
int ran[N];
inline int find(int n)
{if(n!=pre[n])return pre[n]=find(pre[n]);return pre[n];
}
inline void joint (int a,int b)
{int fa=find(a),fb=find(b);if(fa!=fb){if(ran[fa]>ran[fb]){ran[fa]+=ran[fb];pre[fb]=fa;}else{ran[fb]+=ran[fa];pre[fa]=fb;}}
}
inline void init()
{for (int i=0; i<N; i++){pre[i]=i;ran[i]=1;}
}
int main(void)
{int x,y,i,j;init();while (~scanf("%d%d",&x,&y)){if(x==-1&&x==y)break;else if(x==0&&y==0){map<int,int>::iterator it;queue<int> Q;set<int>tp;for (it=deg.begin(); it!=deg.end(); it++){if(it->second<=1){it->second--;Q.push(it->first);tp.insert(it->first);}}while (!Q.empty()){int now=Q.front();Q.pop();for (i=0; i<edge[now].size(); i++){int v=edge[now][i];deg[v]--;if(deg[v]==1)Q.push(v);if(deg[v]==0)tp.insert(v);}}bool flag=1;int cnt=0,father,now;for (it=deg.begin(); it!=deg.end(); it++){now=find(it->first);if(cnt==0){father=find(it->first);cnt++;}else{if(now!=father){flag=0;break;}    }}if(tp.size()==deg.size()&&flag)puts("Yes");elseputs("No");deg.clear();for (i=0; i<N; i++)edge[i].clear();init();}else{joint(x,y);deg[x]++;deg[y]++;edge[x].push_back(y);edge[y].push_back(x);}}return 0;
}

转载于:https://www.cnblogs.com/Blackops/p/5766348.html

HDU——1272小希的迷宫(并查集+拓扑排序)相关推荐

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

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

  2. hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Problem - 1811 感觉这题的并查集以及拓扑排序并不难,但是做题的时候必须理解到矛盾(CONFLICT)与不确定(UNCERTAIN)直接的优先关系. 做这题的时候,构图什么的很简单,就是没 ...

  3. 【判断是不是树】HDU 1272 小希的迷宫

    HDU 1272 小希的迷宫 题意:输入多组无向边,结点的标号是随机的(可以不连续也可以不从1开始).然后让我们判断是不是刚好是一棵树. 需要注意的就是:0 0空树的情况. 代码:(带注释) #inc ...

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

    小希的迷宫                                                                          Time Limit: 2000/1000 ...

  5. HDU 1272 - 小希的迷宫(并查集判树)

    目录 Problem Description C++代码 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来 ...

  6. hdu 1272 小希的迷宫

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

  7. HDOJ---1272 小希的迷宫[并查集]

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

  8. HDU 1272 小希的迷宫 (kruskal)

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

  9. HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me

    link 题意: 首先看到排名自然想到拓扑序,但是存在等于的情况,这就启发我们把等于的情况缩成一个点,让后在缩点后的图中进行拓扑即可. 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点,所以只需要检 ...

最新文章

  1. 神经网络通用近似定理
  2. 叶明哲 | 数据中心空调那点事
  3. 只会linux和sql能维护mes系统么,MES系统软件架构介绍
  4. JVM调优总结 -Xms -Xmx -Xmn -Xss(转载)
  5. 虎牙联合河北省反诈中心推出“青少年反诈教育公开课”
  6. #6282. 数列分块入门 6
  7. THREEJS - mousedown/mouseup等鼠标相关事件失效
  8. Linux下安装python及MySQLdb
  9. C语言关键字详解(五)带你全面了解 volatile 关键字
  10. 坦克大战的Lua实现
  11. tp5利用mysql数据库去重
  12. 2dx cound not find libcocos2dcpp.so
  13. 中国黑客传说:游走在黑暗中的精灵
  14. 小程序中实现用户的登录与注册
  15. python如何设置矩阵_Python Numpy如何操作数组和矩阵
  16. 合同生效需要哪些要件
  17. 中国移动云mas短信对接(webservice)
  18. 水井坊:“高端化”的尴尬与库存危机
  19. 某同学使用计算机求,【判断题】某同学计算机考试成绩80分,这是统计指标值...
  20. EventBus介绍与使用

热门文章

  1. linux mkfifo管道
  2. 孩子们的游戏(圆圈中最后剩下的数)
  3. Django+nginx+uwsgi+ubuntu18.04网站部署
  4. mysql数据库的创建外键_Mysql表创建外键报错解决方案
  5. LVS——NAT网络地址转换模式
  6. Python中变量判断
  7. 十六进制数用int吗_你真的精通C语言吗?来解这十道C语言迷题试试吧!
  8. Ubuntu远程服务器创建新用户并赋予权限
  9. 使用Pycharm将代码同步到GitHub
  10. Delphi的MessageBox对话框使用