在这样的一道题目里,我实现了这样一份代码,结果 RE 掉了(RE on 9∼20)。
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <iostream>
#include <string>
namespace Use {
using __gnu_pbds::gp_hash_table;
using std::cin;
using std::cout;
using std::ios;
using std::min;
using std::string;
} // namespace Use
using namespace Use;
typedef long long ll;
const int maxn = 8e3 + 5, maxm = 2.4e5 + 5;
gp_hash_table<string, int> num;
int n;
struct Edge {
int to, next;
} edge[maxm];
int head[maxn], len;
void insert(int &u, int &v) {
edge[++len] = {v, head[u]}, head[u] = len;
}
int dfn[maxn], low[maxn], Tim, s[maxn], cnt, belong[maxn];
bool vis[maxn];
void Tarjan(const int &u) {
dfn[u] = low[u] = ++Tim, vis[u] = 1, s[++*s] = u;
for (int i = head[u], v; i; i = edge[i].next) {
v = edge[i].to;
if (!dfn[v])
Tarjan(v), low[u] = min(low[u], low[v]);
else if (vis[v])
low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++cnt;
for (int v; s[*s + 1] != u; --*s) vis[v = s[*s]] = 0, belong[v] = cnt;
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(nullptr), cout.tie(nullptr);
int m;
string u, v;
cin >> n;
for (int i = 1; i <= n; ++i) cin >> u >> v, insert(num[u] = i, num[v] = n + i);
cin >> m;
for (; m; --m) cin >> u >> v, insert(num[v], num[u]);
for (int i = 1; i <= n << 1; ++i)
if (!dfn[i]) Tarjan(i);
for (int i = 1; i <= n; ++i) printf("%s", belong[i] == belong[i + n] ? "Unsafe" : "Safe"), putchar(10);
return 0;
}
但若是换成其他数据存储方式则 AC,即
#include <iostream>
#include <string>
#include <unordered_map>
namespace Use {
using std::cin;
using std::cout;
using std::ios;
using std::min;
using std::string;
using std::unordered_map;
} // namespace Use
using namespace Use;
typedef long long ll;
const int maxn = 8e3 + 5, maxm = 2.4e5 + 5;
unordered_map<string, int> num;
int n;
struct Edge {
int to, next;
} edge[maxm];
int head[maxn], len;
void insert(int &u, int &v) {
edge[++len] = {v, head[u]}, head[u] = len;
}
int dfn[maxn], low[maxn], Tim, s[maxn], cnt, belong[maxn];
bool vis[maxn];
void Tarjan(const int &u) {
dfn[u] = low[u] = ++Tim, vis[u] = 1, s[++*s] = u;
for (int i = head[u], v; i; i = edge[i].next) {
v = edge[i].to;
if (!dfn[v])
Tarjan(v), low[u] = min(low[u], low[v]);
else if (vis[v])
low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++cnt;
for (int v; s[*s + 1] != u; --*s) vis[v = s[*s]] = 0, belong[v] = cnt;
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(nullptr), cout.tie(nullptr);
int m;
string u, v;
cin >> n;
for (int i = 1; i <= n; ++i) cin >> u >> v, insert(num[u] = i, num[v] = n + i);
cin >> m;
for (; m; --m) cin >> u >> v, insert(num[v], num[u]);
for (int i = 1; i <= n << 1; ++i)
if (!dfn[i]) Tarjan(i);
for (int i = 1; i <= n; ++i) printf("%s", belong[i] == belong[i + n] ? "Unsafe" : "Safe"), putchar(10);
return 0;
}
或者将主函数中第一个插入边的方式换成这样的,也能 AC
int main() {
ios::sync_with_stdio(0), cin.tie(nullptr), cout.tie(nullptr);
int m;
string u, v;
cin >> n;
for (int i = 1; i <= n; ++i) cin >> u >> v, num[u] = i, insert(num[u], num[v] = n + i);
cin >> m;
for (; m; --m) cin >> u >> v, insert(num[v], num[u]);
for (int i = 1; i <= n << 1; ++i) if (!dfn[i])
Tarjan(i);
for (int i = 1; i <= n; ++i) printf("%s", belong[i] == belong[i + n] ? "Unsafe" : "Safe"), putchar(10);
return 0;
}
请问一下大佬们究竟是什么问题导致的?