这个题的SPJ是啥玩意儿啊
查看原帖
这个题的SPJ是啥玩意儿啊
367296
cjwen祺楼主2024/7/12 11:25

我在这道题测试一个假做法的效率,交上去第一个点就 WA 了。可是我把数据下载下来本地跑,瞪眼检查发现没啥问题啊。

我请求:

  1. 管理员检查一下 SPJ 的正确性(当然也可能是我代码有错)
  2. 现在的 SPJ 一直说什么“答案错误。答案错误嗯嗯嗯。有一些问题。杨超越认为你的答案不对。”(大致中文翻译),没给出任何有效提示信息。最好还是改成返回第一个错误的位置。

【附:】

评测链接:https://www.luogu.com.cn/record/165439930

数据第一个点:

10 25
7 1 -19980715
1 2 -19980576
4 3 -19980530
6 4 19980586
8 5 19980529
9 6 -19980646
5 7 -19980535
2 8 19980544
3 9 -19980707
10 10 -19980533
4 7 19503701
9 8 19432230
5 3 -17629031
3 3 17292913
9 7 15034265
7 2 19764472
3 1 19881238
7 8 17086831
5 10 16874235
4 10 14825686
4 5 15369436
7 9 15685396
4 8 15281602
2 7 17633673
4 1 18536770

答案:

37441208
3 1 5 6 8 9 4 2 7 10

我的输出:

37441208
2 8 1 7 3 4 9 5 6 10

我的代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>

using namespace std;

const int N = 1010, M = 2e6+10;

int n, m, s, t;
int he[N], nw[N], ne[M], f[M], c[M], to[M], ecnt = 1;

void yadd(int x, int y, int z, int w){
    ne[++ecnt] = he[x];
    he[x] = ecnt;
    to[ecnt] = y;
    f[ecnt] = z;
    c[ecnt] = w;
}

void add(int x, int y, int z, int w){
    yadd(x, y, z, w);
    yadd(y, x, 0, -w);
}

long long dis[N];

queue<int> q;

bool spfa(){
    memset(dis, -0x3f, sizeof(dis));
    dis[s] = 0;
    q.push(s);
    while(!q.empty()){
        int x = q.front();
        q.pop();
        nw[x] = he[x];
        for(int i = he[x]; i; i = ne[i]){
            int j = to[i];
            if(dis[j] < dis[x] + c[i] && f[i]){
                dis[j] = dis[x] + c[i];
                q.push(j);
            }
        }
    }
    return dis[t] > -1e18;
}

long long cans;
bool vis[N];

int Dinic(int x, long long fl){
    if(x == t || fl == 0){
        return fl;
    }
    vis[x] = 1;
    int dans = 0, dtans = 0;
    for(int i = nw[x]; i && fl; i = ne[i]){
        nw[x] = i;
        int j = to[i];
        if(!vis[j] && f[i] && dis[x] + c[i] == dis[j]){
            dtans = Dinic(j, min((long long)f[i], fl));
            fl -= dtans;
            dans += dtans;
            f[i] -= dtans;
            f[i^1] += dtans;
            cans += c[i] * dtans;
        }
    }
    vis[x] = 0;
    return dans;
}

int nl, nr;

vector<int> g[N];

int main(){

    scanf("%d%d", &nl, &m);
    nr = nl;
    s = nl+nr+1;
    t = nl+nr+2;
    for(int i = 1; i <= nl; i++) add(s, i, 1, 0);
    for(int i = 1; i <= nr; i++) add(i+nl, t, 1, 0);
    int x = 0, y = 0, w = 0;
    while(m--){
        scanf("%d%d%d", &x, &y, &w);
        add(x, y+nl, 1, w);
        g[x].push_back(ecnt-1);
    }

    long long ans = 0, tans = 0;
    while(spfa()){
        while(tans = Dinic(s, 0x3f3f3f3f3f3f3f3f)){
            ans += tans;
        }
    }

    printf("%lld\n", cans);
    for(int i = 1; i <= nl; i++){
        int tp = 0;
        for(int j : g[i]){
            if(!f[j]){
                tp = to[j]-nl;
                break;
            }
        }
        printf("%d ", tp);
    }
    // puts("");

    return 0;
}
2024/7/12 11:25
加载中...