疑问
  • 板块P2648 赚钱
  • 楼主qW__Wp
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/26 14:54
  • 上次更新2024/7/26 15:46:29
查看原帖
疑问
453555
qW__Wp楼主2024/7/26 14:54

WA #1 90 pts 的原代码:

#include <bits/stdc++.h>
#define int long long
#define INF 0x3fffffff
#define INFF 1e18
#define endl '\n'
#define lson id << 1
#define rson id << 1 | 1
#define LL long long
#define ULL unsigned long long
 
using namespace std;
 
const int N = 305, M = 705;
 
struct Edge {
    int to, nx, w;
} e[M + N];
 
int hd[N], cnt;
int dis[N];
bool vis[N];
int D, n, m1, m2;
int num[N], ans;
 
void add(int u, int v, int w) {
    e[ ++ cnt] = {v, hd[u], w}, hd[u] = cnt;
}
 
bool SPFA(int s) {
    for (int i = 1; i <= n; i ++) dis[i] = -INF;
    dis[s] = 0;
    queue<int> q;
    q.push(s);
    while (!q.empty()) {
        int u = q.front(); q.pop(); vis[u] = 0;
        ans = max(ans, dis[u]);
        for (int i = hd[u]; i != -1; i = e[i].nx) {
            int v = e[i].to, w = e[i].w;
            if (dis[v] < dis[u] + w) {
                dis[v] = dis[u] + w; num[v] = num[u] + 1;
                if (num[v] >= n) return false;
                if (!vis[v]) q.push(v), vis[v] = 1;
            }
        }
    }
    return true;
}
 
signed main() {
    cin >> D >> m1 >> n >> m2;
    for (int i = 0; i <= n; i ++) hd[i] = -1;
    for (int i = 1; i <= m1; i ++) {
        int u, v;
        cin >> u >> v;
        add(u, v, D);
    }
    for (int i = 1; i <= m2; i ++) {
        int u, v, w;
        cin >> u >> v >> w;
        add(u, v, D - w);
    }
    for (int i = 1; i <= n; i ++) {
        add(0, i, D);
    }
    bool f = SPFA(0);
    if (!f) cout << "orz";
    else cout << ans;
    return 0;
}

将第41行

if (num[v] >= n) return false;

修改为

if (num[v] > n) return false;

即AC。

原代码判负环参照 oi-wiki SPFA 中的代码的写法,但是出错。

求助原因?

2024/7/26 14:54
加载中...