1.题目链接。判断图是不是一个强连通的图。tarjan算法对图的强连通分量计数即可。
using namespace std;
vector<int >mp[maxn];
int vis[maxn];
int dfn[maxn];
int low[maxn];
int n, m, cnt, sig;
void init()
{
memset(low, 0, sizeof(low));
memset(dfn, 0, sizeof(dfn));
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)mp[i].clear();
}
void tarjan(int u)
{
vis[u] = 1;
low[u] = dfn[u] = cnt++;
for (int i = 0; i < mp[u].size(); i++)
{
int v = mp[u][i];
if (vis[v] == 0)tarjan(v);
if (vis[v] == 1)low[u] = min(low[u], low[v]);
}
if (dfn[u] == low[u])
{
sig++;
}
}
int main()
{
while (~scanf("%d", &n))
{
if (n == 0)break;
scanf("%d", &m);
init();
for (int i = 0; i < m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
mp[x].push_back(y);
}
cnt = 1;
sig = 0;
for (int i = 1; i <= n; i++)
{
if (vis[i] == 0)
tarjan(i);
}
if (sig == 1)
{
puts("Yes");
}
else
{
puts("No");
}
}
}