https://www.lydsy.com/JudgeOnline/problem.php?id=2140
我要被
Tarjan
T
a
r
j
a
n
搞死了..
栈里面到底是存什么啊….
访问的时候到底怎么处理啊….
Codes
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int to[N], head[N], nxt[N], e;
int dfn[N], low[N], cnt;
int Sta[N], top, ins[N];
int colors, be[N];
map<string, int> mp;
void add(int x, int y) {
to[++ e] = y; nxt[e] = head[x]; head[x] = e;
}
void dfs(int x, int fa) {
Sta[top ++] = x; ins[x] = 1;
dfn[x] = low[x] = ++ cnt;
for(int i = head[x]; i; i = nxt[i]) {
if(!dfn[to[i]]) {
dfs(to[i], x);
low[x] = min(low[x], low[to[i]]);
}
if(ins[to[i]])
low[x] = min(low[x], dfn[to[i]]);
}
if(low[x] == dfn[x]) {
++ colors; int tmp = 0;
while(tmp != x) {
tmp = Sta[-- top];
ins[tmp] = 0;
be[tmp] = colors;
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("1407.in", "r", stdin);
freopen("1407.out", "w", stdout);
#endif
string s; int n, m, x, y;
scanf("%d", &n);
for(int i = 1; i <= n; ++ i) {
cin >> s; mp[s] = i;
cin >> s; mp[s] = i + n;
add(i, i + n);
}
scanf("%d", &m);
for(int i = 1; i <= m; ++ i) {
cin >> s; x = mp[s];
cin >> s; y = mp[s];
add(y, x);
}
for(int i = 1; i <= (n << 1); ++ i)
if(!dfn[i])
dfs(i, 0);
for(int i = 1; i <= n; ++ i)
printf("%s\n", (be[i] == be[i + n]) ? "Unsafe" : "Safe");
return 0;
}