hdu 3478 Catch
来源:互联网 发布:云杉网络 张天鹏 编辑:程序博客网 时间:2024/05/21 14:46
题目大概意思是,有n个点,m条边。罪犯可以从a点到达b点的条件是a,b有边相连,那么如果每一次他都不停止运动,他有没有可能在一个时间点到达任意一个点。
我们先bfs一遍,然后把他奇数时间能到达的点标记为1,偶数时间能到达的点标记为 0。这样标记之后,我们要做的是看能不能得到一个二部图。
如果在同为标记为1或0的集合中存在两个点有边相连,那么就说明他不是一个二部图,也就是在某个奇数时间能到达该点,在某个偶数时间也能到达该点,这样回溯回去的话,就可能在一个时间到达任意一个点。
#include <iostream>#include<cstdio>#include<vector>#include<cstring>#include<queue>using namespace std;vector<int>v[100010];int even_odd[100010]; //在奇数时间访问到标记为1,偶数时间访问到标记为0int n,m,s;queue<int>q;bool bfs(){ while(!q.empty()) { int cur = q.front(); q.pop(); for(int i = 0; i< v[cur].size(); i++) { int temp = v[cur].at(i); if(even_odd[temp] == -1) { even_odd[temp] = even_odd[cur] ^ 1; q.push(temp); } else if(even_odd[temp] == even_odd[cur]) return true; } } return false;}int main(){ int cas = 1; int t; scanf("%d",&t); while(t--) { ans = 1; scanf("%d %d %d",&n,&m,&s); memset(even_odd,-1,sizeof(even_odd)); for(int i = 0 ; i < n; i++) v[i].clear(); while(!q.empty()) q.pop(); for(int i = 0 ; i < m; i++) { int a,b; scanf("%d %d",&a,&b); v[a].push_back(b); v[b].push_back(a); } even_odd[s] = 0; //起始点标记为0 q.push(s); printf("Case %d: ",cas++); if(bfs()) printf("YES\n"); else printf("NO\n"); } return 0;}
0 0
- Catch hdu 3478
- hdu 3478 Catch
- HDU 3478 Catch
- 【染色法】hdu 3478 Catch
- HDU 3478 Catch(二分图判定)
- HDU 3478 Catch(判断奇数环)
- hdu 3478 Catch 二分图判断
- 邻接表vector HDU 3478 catch
- hdu 3478 Catch(判断奇数环)
- HDU 3478 Catch【kurskal+二分图染色】
- HDU 3478 Catch【二分图+思维】
- hdu catch the thief
- hdu 2351 Catch him
- HDU 2531 Catch him
- HDU 2531 Catch him
- hdu Catch That Cow
- HDU:Catch that cow
- HDU 2531 Catch him
- ubuntu安装使用笔记05——sqldeveloper安装
- python strip()函数
- HDU 1874 畅通工程续 最短路
- 博客第一天
- Android获取明天日期
- hdu 3478 Catch
- 【LeetCode】Best Time to Buy and Sell Stock II
- 考数据库系统会用到的一些计算方法和题目整理(1)
- Linux Input子系统之第一篇(input_dev/input_handle/input_handler)
- Windows系统配置PHP+Apache
- 【OpenGL游戏开发之五】freetype2 显示汉字
- ubuntu下hello world kernel Module:MODPOST 0 modules
- Java synchronized详解
- linux下杀死进程全权讲解