题意就是在给定一个图的情况下,问这个单向图是不是强连通图。
强连通图的意思就是图中任何一个点都可以到达另一个点。
分析:这道题是tarjan算法求强连通分量的模板题,对于tarjan算法求连通分量的方法大致上是给每一个点标两个号,一个是自己是第几个被搜索到i,也叫时间标号(代码中用dfn【i】来表示第i个点的标号),另一个是这个点的子树中所能搜到的最小的时间标号(代码中用low【i】)表示,如果时间标号==low【i】那么表示形成了一个联通分量,具体的或者更加详细的参考https://www.cnblogs.com/shadowland/p/5872257.html
再来说本题:要想证明一个图是连通图,则只需要证明整个图只有一个连通分量即可;
代码:
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + 10;
const int maxm = 1e5 + 10;
int cnt = 0;
int ans = 0;
int n, m;
int head[maxn], dfn[maxn], low[maxn];
bool vis[maxn];
stack<int>iron;
struct Edge
{
int from,to, next;
}edge[maxm];
void addedge(int u, int v)
{