大家好!我是老码农。
昨天小码匠挺憋屈的,1天点灯熬油搞了3道题。
第1题:搞了一上午,没AC,中午收工的时候弄了个30分,草草上午收场。
下午继续搞,接近3点的时候终于AC掉第一题
第2题:继续不顺利,强连通分量+拓扑排序+DP,搞了一下午,结果呢,到吃饭的时候还没搞出来。
晚上7点多一点,终于AC掉第2题。
第3题:我预估得搞到9点半,结果突然跟我说,AC了,我下了,然后人瞬间就跑了,喊都回不来。
这两天群中群友也在聊暑假出行的事,大家的观点比较一致,到初中后,时间真没有啊。
尤其这些搞竞赛的学子,太难了。
现在出去玩的都是小学生居多,初、高中孩子不是在上补习班的路上,就是在家里刷题。
所以:家中有小朋友的,还是多带孩子们出去玩玩,到初中是真没那么多大块时间。
为啥总想分享小码匠的代码呢,小码匠写的代码码风自认为还是非常不错的。
如果家中有小码匠,建议孩子们写代码的时候注意规范,养成一个良好的习惯。
有时候我看题解区,有不少孩子喜欢代码压行写,写的又臭又长,这个习惯非常不好。
尤其你以后工作之后,这种习惯,会让团队了人是不能容忍这种风格的。
好啦,就不啰嗦了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
const int maxm = 2e5 + 5;
typedef long long ll;
int dfn[maxn], low[maxn], color[maxn], t = 1, n, m, c = 0;
bool vis[maxn];
struct edge {
int from, to, next;
} g[maxm];
struct Couple {
string u, v;
} couple[maxn];
int head[maxn];
int k = 0;
void add(int u, int v) {
g[++k].to = v;
g[k].from = u;
g[k].next = head[u];
head[u] = k;
}
stack<int> st;
void tarjan(int x) {
st.push(x);
vis[x] = true;
dfn[x] = t;
low[x] = t;
++t;
for (int i = head[x]; i; i = g[i].next) {
int v = g[i].to;
if (dfn[v] == 0) {
tarjan(v);
low[x] = min(low[x], low[v]);
} else if (vis[v]) {
low[x] = min(low[x], dfn[v]);
}
}
if (dfn[x] == low[x]) {
++c;
while (!st.empty()) {
int u = st.top();
vis[u] = false;
st.pop();
color[u] = c;
if (x == u) {
break;
}
}
}
}
void best_coder() {
unordered_map<string, int> name;
cin >> n;
int a = 1;
for (int i = 0; i < n; ++i) {
cin >> couple[i].u >> couple[i].v;
name[couple[i].u] = a++;
name[couple[i].v] = a++;
add(a - 2, a - 1);
}
cin >> m;
for (int i = 0; i < m; ++i) {
string u, v;
cin >> u >> v;
add(name[v], name[u] );
}
for (int i = 1; i <= n * 2; ++i) {
if (!dfn[i]) {
tarjan(i);
}
}
for (int i = 0; i < n; ++i) {
int u = name[couple[i].u];
int v = name[couple[i].v];
if (color[u] == color[v]) {
cout << "Unsafe\n";
} else {
cout << "Safe\n";
}
}
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
return 0;
}