我在这道题测试一个假做法的效率,交上去第一个点就 WA 了。可是我把数据下载下来本地跑,瞪眼检查发现没啥问题啊。
我请求:
【附:】
评测链接: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;
}