题目
样例
用最简单的方法Korasaju算法,两次dfs深搜,第一次搜索正向图,第二次搜索它的转制图,如果两次搜索得到的节点数一样,就说明这张图连通!
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#define mem(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define _for(i,a,b) for( int i=(a); i<(b); ++i)
#define _rep(i,a,b) for( int i=(a); i<=(b); ++i)
typedef long long ll;
using namespace std;
#define maxn 10005
int n, m;
int cnt;
int vis[maxn];
vector<int>uv[maxn], vu[maxn];//uv是正向,vu是反向图
void dfs1(int u) {
vis[u] = 1;
cnt++;
int len = uv[u].size();
_for(i, 0, len) {
int v = uv[u][i];
if (!vis[v])
dfs1(v);
}
}
void dfs2(int v) {
vis[v] = 1;
cnt++;
int len = vu[v].size();
_for(i, 0, len) {
int u = vu[v][i];
if (!vis[u])
dfs2(u);
}
}
int main()
{
while (scanf("%d%d", &n, &m) , n+m) {
mem(vis, 0);
_rep(i, 1, n) {
uv[i].clear();
vu[i].clear();
}
while (m--) {
int u, v;
scanf("%d%d", &u, &v);
uv[u].push_back(v);
vu[v].push_back(u);
}
cnt = 0;
dfs1(1);
if (cnt == n) {
mem(vis, 0);
cnt = 0;
dfs2(1);
if (cnt != n)
cout << "No" << endl;
else
cout << "Yes" << endl;
}
else
cout << "No" << endl;
}
return 0;
}