Legal or Not(拓扑排序判环)
http://acm.hdu.edu.cn/showproblem.php?pid=3342
Legal or Not
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5788 Accepted Submission(s): 2678
We all know a master can have many prentices and a prentice may have a lot of masters too, it's legal. Nevertheless,some cows are not so honest, they hold illegal relationship. Take HH and 3xian for instant, HH is 3xian's master and, at the same time, 3xian is HH's master,which is quite illegal! To avoid this,please help us to judge whether their relationship is legal or not.
Please note that the "master and prentice" relation is transitive. It means that if A is B's master ans B is C's master, then A is C's master.
TO MAKE IT SIMPLE, we give every one a number (0, 1, 2,..., N-1). We use their numbers instead of their names.
If it is legal, output "YES", otherwise "NO".
0 1
1 2
2 2
0 1
1 0
0 0
NO
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 150
struct Edge{
int to;
int next;
}edge[N];
int head[N];
int Enct;
int in[N];
void init()
{
Enct = ;
memset(head,-,sizeof(head));
memset(in,,sizeof(in));
}
void add(int from , int to )
{
edge[Enct].to = to;
edge[Enct].next = head[from];
head[from]= Enct++;
}
int que[N];
int n;
bool ph()
{
int c = ;
for(int i = ; i < n ;i++)
{
if(in[i]==) que[c++] = i;
}
for(int i = ; i < c; i++)
{
for(int j = head[que[i]] ; j!=-; j= edge[j].next)
{
Edge e = edge[j];
in[e.to]--;
if(in[e.to]==)
que[c++] = e.to;
}
}
//printf("c = %d\n",c);
if(c<n-) return false ;
else return true;
}
int main()
{
int m ;
while(~scanf("%d%d",&n,&m)&&(n!=||m!=))
{
init();
for(int i = ;i < m ;i++)
{
int a , b;
scanf("%d%d",&a,&b);
add(a,b);
in[b]++;
}
if(ph()) printf("YES\n");
else printf("NO\n");
} return ;
}
下面是dfs超时的代码
//这种遍历所有路径的方法一般会超时,真的超时了,嘎嘎
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 150
int vis[N];
int n ;
struct Edge{
int to ;
int next;
}edge[N];
int head[N];
int Enct;
void init()
{
Enct = ;
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));//标记0为未访问
}
void add(int from , int to )
{
edge[Enct].to = to;
edge[Enct].next = head[from];
head[from] = Enct++;
}
/*bool dfs(int i )
{
if(vis[i]) return false;
vis[i] = 1;
printf("vis[%d] = %d\n",i,vis[i]);
for(int j = head[i] ; j!=-1; j = edge[j].next)
{
Edge e = edge[j];
dfs(e.to);
}
return true;
}*/
bool tm = true;
bool dfs(int i )
{
vis[i]=;
for(int j = head[i] ; j!=- ;j = edge[j].next)
{
Edge e = edge[j];
if(vis[e.to]==) tm = false;
else
{
dfs(e.to);
vis[e.to]=;//保证dfs走的是一条链,每次回溯的时候相当于走反向所以标记成未访问
}
}
return tm;
}
int main()
{
int m ;
while(~scanf("%d%d",&n,&m)&&(n!=||m!=))
{
init();
tm = true;
for(int i = ;i < m ;i++)
{
int a ,b;
scanf("%d%d",&a,&b);
add(a,b);
}
bool flag = true;
for(int i= ; i < n ;i++)
{
if(flag == false) break;
if(vis[i]==)
flag = dfs(i);
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return ;
}
Legal or Not(拓扑排序判环)的更多相关文章
- POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39602 Accepted: 13 ...
- LightOJ1003---Drunk(拓扑排序判环)
One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...
- HDU1811 拓扑排序判环+并查集
HDU Rank of Tetris 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1811 题意:中文问题就不解释题意了. 这道题其实就是一个拓扑排序判圈 ...
- [bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)
题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...
- Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)
Almost Acyclic Graph CodeForces - 915D time limit per test 1 second memory limit per test 256 megaby ...
- 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环
[题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一 ...
- HDU.3342 Legal or Not (拓扑排序 TopSort)
HDU.3342 Legal or Not (拓扑排序 TopSort) 题意分析 裸的拓扑排序 根据是否成环来判断是否合法 详解请移步 算法学习 拓扑排序(TopSort) 代码总览 #includ ...
- HDU 3342 Legal or Not(有向图判环 拓扑排序)
Legal or Not Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 5222 ——Exploration——————【并查集+拓扑排序判有向环】
Exploration Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
随机推荐
- vs code调试console程序报错--preLaunchTask“build”
网上有其他大神给出的建议是注释掉launch.json中的 "preLaunchTask": "build", 但是这种方式也会造成一个问题,就是再使用F5调试 ...
- Java 哲学家进餐
某次操作系统实验存档.V 这个哲学家除了吃就知道睡.( ╯□╰ ) 哲学家.java: package operating.entity.philosophyeating; import operat ...
- php-redis 操作类 封装
<?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...
- 记vue API 知识点
1. v-cloak指令:这个指令保持在元素上直到关联实例结束编译.和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标 ...
- c#访问oracle数据库
想在c#中访问oracle数据库,毕竟是开发,想要轻量级访问oracle,客户机上无需安装oracle环境就能正常运行程序. 在网上找了相关资料,只需要引用一个dll即可实现. 访问代码(需引用dll ...
- TreeMap源码
一.TreeMap简介 TreeMap是基于红黑树的java版实现,作者Josh Bloch and Doug Lea(这二人在java发展的早期做了重大贡献,比如集合框架JDK1.2.并发包JDK1 ...
- C# 多线程传递多个参数
http://www.cnblogs.com/lvdongjie/p/5416883.html 3. 方式三:采用lambda表达式 对于lambda表达式不熟悉的可以查看微软MSDN上的说明文档.此 ...
- C#-判断Shift,Alt,Ctrl是否被按下,确定所按下的组合键
在创建接受用户击键的应用程序时,您还可能希望监视 SHIFT.ALT 和 CTRL 键等组合键.当一个组合键与其他键同时按下,或在单击鼠标的同时按下时,您的应用程序能够做出适当响应:字母 S 可能仅导 ...
- CHECKDB内部:什么是BlobEater?
DBCC CHECKDB注意到有关数据文件页面.一旦整个表的所有页(或一组表,如果配料已启用-看到同样的博客文章我上面提到的),所有的事实都聚集在一起,他们都应该相互抵消.当有额外的事实(在索引B树都 ...
- Linux上安装Redis
很多编程的小朋友一提到Linux脑袋就大了,我也一样,我是一个大专的学生,没有学过Linux,感觉自己欠缺很多,也知道了人和人之间的差距,当你真正的走上社会,才知道社会是什么,才知道没有学历找工作有多 ...