关于 pb_ds 疑问
  • 板块学术版
  • 楼主DAMDAM
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/13 11:51
  • 上次更新2024/3/13 12:06:21
查看原帖
关于 pb_ds 疑问
759326
DAMDAM楼主2024/3/13 11:51

P1407 [国家集训队] 稳定婚姻

在这样的一道题目里,我实现了这样一份代码,结果 RE 掉了(RE on 9∼209\sim20)。

#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;
}

请问一下大佬们究竟是什么问题导致的?

2024/3/13 11:51
加载中...