/*该题被博客里标记为中等题,30分钟内1A,掌握了算法就简单了,单向连通图判定,单向连通图缩点后必然唯一存在出度为0的点和入度为0的点,并且从入度为0的点出发,可以遍历所有点后到达出度为0点(一条长链),(容易反证),所以缩点后,我重新建图(以前觉得重新建图好麻烦,现在看来SO easy),,对新有向无环图,从入度为0的点做dfs(回溯时要标记回来,因为要所有dfs路线),有一条深度到达强连通分支数即为yes,反之no*/#include //297MS, 1A,简单题。#include #include #include #include using namespace std;int n;int m;const int MAX=1001;vector >edges(MAX); //原图vector >newedge(MAX);//缩点后图int visited[MAX]; //原图tarjanint low[MAX];int dfn[MAX];bool mark[MAX]; //新图dfs标记int Strongly_connected_branch[MAX]; //并为一个强连通,标记为1.2.3...int num;int times; stack s; bool instack[MAX];int ind[MAX]; //入度数组void tarjan(int u){ low[u]=dfn[u]=times++; instack[u]=1; s.push(u); int len=edges[u].size(); for(int i=0;i low[v])low[u]=low[v]; } else if(instack[v]&&low[u]>dfn[v]) //有向图,要问是否在栈中,后向边,V为U某个祖先 { low[u]=dfn[v]; } } if(dfn[u]==low[u]) //在一个SCC { num++;int temp; do { temp=s.top(); instack[temp]=0; s.pop(); Strongly_connected_branch[temp]=num; } while(temp!=u); }}bool is_no; void dfs(int u,int depth) //新图的dfs{ if(depth==num)is_no=true; int len=newedge[u].size(); for(int i=0;i