1 条题解
-
2
郑梓轩 (zhengzixuanlovechina) LV 5 @ 2022-7-29 19:19:10
tarjan做法:
#include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <ctime> #include <fstream> #include <iomanip> #include <iostream> #include <queue> #include <set> #include <stack> #include <string> #include <vector> #define LL long long #define uLL unsigned long long using namespace std; const int N = 1e5 + 5; const int INF = 0x3f3f3f3f; int T, m, n, pos, sum, id, cnt, tot, top, st[N], num[N], col[N], vis[N], low[N], dfn[N], to[N], ne[N], head[N], a[N], b[N]; bool flag; void add(int x, int y){ to[++id] = y, ne[id] = head[x], head[x] = id; } void init(){ pos = sum = id = cnt = tot = top = 0; memset (st, 0, sizeof(st)); memset (num, 0, sizeof(num)); memset (col, 0, sizeof(col)); memset (vis, 0, sizeof(vis)); memset (dfn, 0, sizeof(dfn)); memset (to, 0, sizeof(to)); memset (ne, 0, sizeof(ne)); memset (head, 0, sizeof(head)); memset (a, 0, sizeof(a)); memset (b, 0, sizeof(b)); } void tarjan(int u, int no_x, int no_y){ st[++top] = u, vis[u] = 1, dfn[u] = low[u] = ++cnt; for (int i = head[u]; i; i = ne[i]){ int v = to[i]; if (v == no_y && no_x == u) continue; if (!dfn[v]){ tarjan(v, no_x, no_y); low[u] = min(low[u], low[v]); } else if (vis[v]) low[u] = min (low[u], dfn[v]); } if (dfn[u] == low[u]){ tot++; while (1){ vis[ st[top] ] = 0, num[tot]++, col[ st[top] ] = tot, top--; if (st[top + 1] == u) break; } } } int main(){ cin >> T; while (T--){ init(); cin >> n >> m; flag = 1; for (int i = 1; i <= m; i++){ cin >> a[i] >> b[i]; add(a[i], b[i]); } for (int j = 1; j <= m; j++){ for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i, a[j], b[j]); } for (int i = 1; i <= m; i++) if (col[ a[i] ] != col[ b[i] ]){ cout << "YES\n"; flag = 0; break; } if (flag) cout << "NO\n"; } return 0; }
- 1
信息
- ID
- 2310
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 183
- 已通过
- 21
- 上传者