1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| using namespace std; typedef long long ll; const int N = 1e4+5; const int M = 1e5+5;
struct E { int to, next; } e[M];
int H[N], tot;
int S[N], top; int dfn[N], low[N], bel[N], idx, scc;
int n, m; int u, v;
void add(int from, int to) { e[tot] = {to, H[from]}; H[from] = tot++; }
void dfs(int u) { dfn[u] = low[u] = ++idx; S[++top]=u;
for(int i=H[u]; ~i; i=e[i].next) { int v = e[i].to; if(!dfn[v]) { dfs(v); low[u] = min(low[u], low[v]); } else if(!bel[v]) low[u] = min(low[u], dfn[v]); } if(low[u]==dfn[u]) { scc++; int t; do { t=S[top--]; bel[t]=scc; } while(t!=u); } }
void tarjan() { memset(dfn, 0, sizeof(dfn)); memset(bel, 0, sizeof(bel)); idx = scc = top = 0; for(int i=1; i<=n; i++) { if(!dfn[i]) dfs(i); } }
int main(void) { while(scanf("%d%d",&n,&m)==2 && (n || m)) { memset(H, -1, sizeof(H)); tot = 0; for(int i=0; i<m; i++) { scanf("%d%d", &u, &v); add(u, v); } tarjan(); if(scc==1) printf("Yes\n"); else printf("No\n"); } return 0; }
|