传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1042

试题描述:

LZJ有一个问题想问问大家。他在写函数时有时候很头疼,如他写了这样几个函数:

void f1()
{
   f2();
   f3();
}
void f2()
{
   f3();
}
void f3()
{
   f1();
}
LZJ发现他无论怎么调换函数的位置,编译器总是不能通过编译,因为编译器规定调用的函数必须在当前函数之前写。
还有一种情况是这样的:
void f4()
{
   f4();
}
虽然能通过编译但会无限递归。
现在LZJ想问问你,他写了一些函数,并且给你每个函数调用了哪些别的函数(可能调用本身),请问他能否通过调整函数的位置,使得编译器通过编译且不会出现无限递归?

输入:

输入第一行为一个正整数N,表示有N个函数。
接下来N行每第i行开始有一个自然数K,表示第i个函数共调用了多少别的函数(可能调用本身),接下来K个正整数vij,表示函数i调用了函数vij。

输出:

若可以输出“Yes”,否则输出“No”。

输入示例:

5
1 2
1 3
2 4 5
1 5
0

输出示例:

Yes

其他说明:

1<=N<=200,1<=K<=N, 1<=vij<=N

题解:裸有向图判环直接拓扑排序,然后如果作死可以把边搞成负的上Bellman_Ford……

然后记得判自环。

拓扑排序:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <queue>
  6. #define REP(s, n) for(int i = s; i <= n; i ++)
  7. using namespace std;
  8. const int maxn = + ;
  9. const int maxm = + ;
  10. int In[maxn], n, cnt = ;
  11. int first[maxn], next[maxm], to[maxm];
  12. bool vis[maxn], TAT = true;
  13. int ms = ;
  14. void AddEdge(int u, int v){
  15. next[ms] = first[u];
  16. first[u] = ms;
  17. to[ms] = v;
  18. In[v] ++; ms ++;
  19. return ;
  20. }
  21. void read(int& x){
  22. x = ; int sig = ; char ch = getchar();
  23. while(!isdigit(ch)) { if(ch == '-') sig = -; ch = getchar(); }
  24. while(isdigit(ch)) x = * x + ch -'', ch = getchar();
  25. x *= sig; return ;
  26. }
  27. queue<int> Q;
  28. void init(){
  29. read(n);
  30. int temp;
  31. REP(, n){
  32. read(cnt);
  33. while(cnt --){
  34. read(temp);
  35. if(temp == i) { TAT = false; return ; }
  36. AddEdge(i, temp);
  37. }
  38. }
  39. return ;
  40. }
  41. void work(){
  42. if(!TAT) return ;
  43. REP(, n) if(In[i] == ) Q.push(i), vis[i] = true;
  44. while(!Q.empty()){
  45. int x = Q.front(); Q.pop();
  46. for(int i = first[x]; i; i = next[i]){
  47. int& v = to[i];
  48. if(vis[v]) continue;
  49. In[v] --;
  50. if(In[v] == ) Q.push(v), vis[v] = true;
  51. }
  52. }
  53. return ;
  54. }
  55. void print(){
  56. if(!TAT) { puts("No"); return ;}
  57. REP(, n) if(!vis[i]) { puts("No"); return ;}
  58. puts("Yes"); return ;
  59. }
  60. int main(){
  61. init();
  62. work();
  63. print();
  64. return ;
  65. }

Bellman_Ford:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #define INF 1000000000
  6. using namespace std;
  7. const int maxn=+,maxm=+;
  8. struct Tedge{int x,y,w,next;}adj[maxm];int ms=,fch[maxn];
  9. void AddEdge(int u,int v){
  10. adj[++ms]=(Tedge){u,v,-,fch[u]};fch[u]=ms;return;
  11. }
  12. int d[maxn],n;
  13. bool relax(int u,int v,int w){
  14. if(d[v]>d[u]+w){d[v]=d[u]+w;return true;}
  15. return false;
  16. }
  17. inline int read(){
  18. int x=,sig=;char ch=getchar();
  19. while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
  20. while(isdigit(ch)) x=*x+ch-'',ch=getchar();
  21. return x*=sig;
  22. }
  23. inline void write(int x){
  24. if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
  25. int len=,buf[];while(x) buf[len++]=x%,x/=;
  26. for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
  27. }
  28. void init(){
  29.  
  30. }
  31. bool bellman_ford(){
  32. n=read();
  33. for(int i=;i<=n;i++) d[i]=INF;
  34. for(int i=;i<=n;i++){
  35. int k=read();
  36. for(int j=;j<k;j++){
  37. int a=read();
  38. if(i==a) return false;
  39. AddEdge(i,a);
  40. }
  41. }
  42. bool ToT;
  43. for(int i=;i<=n;i++){
  44. ToT=false;
  45. for(int i=;i<=ms;i++){
  46. int u=adj[i].x,v=adj[i].y,w=adj[i].w;
  47. if(relax(u,v,w)) ToT=true;
  48. }
  49. if(!ToT) break;
  50. }
  51. for(int i=;i<=ms;i++){
  52. int u=adj[i].x,v=adj[i].y,w=adj[i].w;
  53. if(relax(u,v,w)) return false;
  54. }
  55. return true;
  56. }
  57. void work(){
  58. if(bellman_ford()) puts("Yes");
  59. else puts("No");
  60. return;
  61. }
  62. void print(){
  63. return;
  64. }
  65. int main(){
  66. init();work();print();return ;
  67. }
  68. /*
  69. 5
  70. 1 1
  71. 1 3
  72. 1 4
  73. 1 5
  74. 1 6
  75. */

Spfa:超级点向所有点引0再跑

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<queue>
  6. #define inf 100000000
  7. using namespace std;
  8. const int maxn=+,maxm=+;
  9. struct Tedge{int x,y,w,next;}adj[maxm];int ms=,fch[maxn];
  10. void AddEdge(int u,int v,int w){adj[++ms]=(Tedge){u,v,w,fch[u]};fch[u]=ms;return;}
  11. int n;
  12. inline int read(){
  13. int x=,sig=;char ch=getchar();
  14. while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
  15. while(isdigit(ch)) x=*x+ch-'',ch=getchar();
  16. return x*=sig;
  17. }
  18. inline void write(int x){
  19. if(x==){putchar('');return;} if(x<) putchar('-'),x=-x;
  20. int len=,buf[]; while(x) buf[len++]=x%,x/=;
  21. for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
  22. }
  23. bool inque[maxn];
  24. int d[maxn],cnt[maxn];
  25. bool SPFA(int S){
  26. for(int i=;i<=n+;i++) d[i]=inf;
  27. queue<int>Q;Q.push(S);inque[S]=true;d[S]=;
  28. while(!Q.empty()){
  29. int u=Q.front();Q.pop();inque[u]=false;
  30. for(int i=fch[u];i;i=adj[i].next){
  31. int v=adj[i].y;
  32. if(d[v]>d[u]+adj[i].w){
  33. d[v]=d[u]+adj[i].w;
  34. if(!inque[v]){
  35. if(++cnt[v]>=n+) return false;
  36. inque[v]=true;
  37. Q.push(v);
  38. }
  39. }
  40. }
  41. }return true;
  42. }
  43. void init(){
  44. n=read();
  45. for(int i=;i<=n;i++){
  46. AddEdge(n+,i,);
  47. int tp=read();
  48. for(int j=;j<=tp;j++){
  49. int v=read();
  50. if(v==i){puts("No");return;}
  51. AddEdge(i,v,-);
  52. }
  53. }
  54. //for(int i=1;i<=ms;i++) printf("%d %d %d\n",adj[i].x,adj[i].y,adj[i].w);
  55. if(SPFA(n+)) puts("Yes");
  56. else puts("No");
  57. return;
  58. }
  59. void work(){
  60. return;
  61. }
  62. void print(){
  63. return;
  64. }
  65. int main(){
  66. init();work();print();return ;
  67. }

COJ 3012 LZJ的问题 (有向图判环)的更多相关文章

  1. Dwarves (有向图判环)

    Dwarves 时间限制: 1 Sec  内存限制: 64 MB提交: 14  解决: 4[提交][状态][讨论版] 题目描述 Once upon a time, there arose a huge ...

  2. HDU 3342 Legal or Not(有向图判环 拓扑排序)

    Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  3. HDU 5154 Harry and Magical Computer 有向图判环

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5154 题解: 有向图判环. 1.用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访 ...

  4. CodeForces 937D 936B Sleepy Game 有向图判环,拆点,DFS

    题意: 一种游戏,2个人轮流控制棋子在一块有向图上移动,每次移动一条边,不能移动的人为输,无限循环则为平局,棋子初始位置为$S$ 现在有一个人可以同时控制两个玩家,问是否能使得第一个人必胜,并输出一个 ...

  5. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39602   Accepted: 13 ...

  6. Codeforces Round #460 (Div. 2): D. Substring(DAG+DP+判环)

    D. Substring time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  7. CodeForces-1217D (拓扑排序/dfs 判环)

    题意 https://vjudge.net/problem/CodeForces-1217D 请给一个有向图着色,使得没有一个环只有一个颜色,您需要最小化使用颜色的数量. 思路 因为是有向图,每个环两 ...

  8. hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)

    这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...

  9. hdu4888 Redraw Beautiful Drawings 最大流+判环

    hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/6553 ...

随机推荐

  1. PermGen space错误解决方法

    在看下文之前,首先要确认意见事情,就是你是怎样启动tomcat的,我们在平时的开发环境其中,都是通过startup.bat方式启动tomcat的,那么你依照以下的方式,去改动/bin/catalina ...

  2. [转] 不要被C++“自动生成”所蒙骗

    http://www.cnblogs.com/fanzhidongyzby/archive/2013/01/12/2858040.html C++对象可以使用两种方式进行创建:构造函数和复制构造函数. ...

  3. 如何学习H264协议

    如何学习h.264协议 首先,我假定你已经具有如下基础: 1 了解基本的视频知识,知道什么是YCbCr/YUV: 2 知道基本的视频压缩原理: 如果这两条还不具备,那么,停一下,补一下课.这方面的相关 ...

  4. HUD 2444 The Accomodation of Students (二分图染色+最大匹配)

    #include<iostream> #include<cstdio> #include<cstring> #define maxn 2010 using name ...

  5. python文档字符串

    #coding=utf-8 #文档字符串def d(i,j): """这个函数实现了一个乘法运算. 函数会返回一个乘法运算的结果.""" k ...

  6. MySQL数据库中,使用游标循环遍历

    /*对*dt库下的所有数据表删除docuemttype为空和documenttype为MD,PD,ET的数据:delete from 表名 where length(documenttype)< ...

  7. addEventListener之handleEvent

    addEventListener() 方法是将指定的事件监听器注册到目标对象上,当该对象触发指定的事件时,指定的回调函数就会被执行.语法: element.addEventListener(type, ...

  8. centos U盘安装

    1.版本 LiveCD 和 LiveDVD 是可以直接进入运行系统,类似win PE, 进入系统后有一个图标 install - HHD(从硬盘安装). netinstall 是用于网络安装和系统救援 ...

  9. PHP PDO 简单登陆操作

    用PHP做出一个简单的登陆操作,确实很简单,下面就让我给大家简单的介绍一下PDO做出一个登陆界面操作的过程,因为也是初学乍练,不足之处请大家包涵. 首先,首先还要建一个表,在MySQL中建表,核心代码 ...

  10. Pythonchallenge一起来闯关(二)

    前情提要:Pythonchallenge一起来闯关(一) 这一篇来闯关10-15.感觉这几关比先前的难了不少,有的题目完全没思路. 10. 页面源码中的链接点击后有a = [1, 11, 21, 12 ...