HDU——1272小希的迷宫(并查集+拓扑排序)
小希的迷宫
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 41183 Accepted Submission(s): 12691
整个文件以两个-1结尾。
这题比较坑爹。昨天写了一下本地测试都是错误的。然后不想写了,今天中午理了下思路,很顺地写了下来本地测试直接过,花式自信以为能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小希的迷宫(并查集+拓扑排序)相关推荐
- HDU 1272 小希的迷宫 (并查集)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- hdu 1811 Rank of Tetris (并查集+拓扑排序)
Problem - 1811 感觉这题的并查集以及拓扑排序并不难,但是做题的时候必须理解到矛盾(CONFLICT)与不确定(UNCERTAIN)直接的优先关系. 做这题的时候,构图什么的很简单,就是没 ...
- 【判断是不是树】HDU 1272 小希的迷宫
HDU 1272 小希的迷宫 题意:输入多组无向边,结点的标号是随机的(可以不连续也可以不从1开始).然后让我们判断是不是刚好是一棵树. 需要注意的就是:0 0空树的情况. 代码:(带注释) #inc ...
- hdu 1272 小希的迷宫 (并查集)
小希的迷宫 Time Limit: 2000/1000 ...
- HDU 1272 - 小希的迷宫(并查集判树)
目录 Problem Description C++代码 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来 ...
- hdu 1272 小希的迷宫
Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...
- HDOJ---1272 小希的迷宫[并查集]
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDU 1272 小希的迷宫 (kruskal)
题目描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个 ...
- HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me
link 题意: 首先看到排名自然想到拓扑序,但是存在等于的情况,这就启发我们把等于的情况缩成一个点,让后在缩点后的图中进行拓扑即可. 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点,所以只需要检 ...
最新文章
- 神经网络通用近似定理
- 叶明哲 | 数据中心空调那点事
- 只会linux和sql能维护mes系统么,MES系统软件架构介绍
- JVM调优总结 -Xms -Xmx -Xmn -Xss(转载)
- 虎牙联合河北省反诈中心推出“青少年反诈教育公开课”
- #6282. 数列分块入门 6
- THREEJS - mousedown/mouseup等鼠标相关事件失效
- Linux下安装python及MySQLdb
- C语言关键字详解(五)带你全面了解 volatile 关键字
- 坦克大战的Lua实现
- tp5利用mysql数据库去重
- 2dx cound not find libcocos2dcpp.so
- 中国黑客传说:游走在黑暗中的精灵
- 小程序中实现用户的登录与注册
- python如何设置矩阵_Python Numpy如何操作数组和矩阵
- 合同生效需要哪些要件
- 中国移动云mas短信对接(webservice)
- 水井坊:“高端化”的尴尬与库存危机
- 某同学使用计算机求,【判断题】某同学计算机考试成绩80分,这是统计指标值...
- EventBus介绍与使用