萌新刚学 OI,求助炸掉的费用流
查看原帖
萌新刚学 OI,求助炸掉的费用流
298549
SIXIANG32楼主2021/6/13 10:55
#include <cstdio> 
#include <queue>
#include <cstring>
#define N 200
#define M 500000
#define QWQ cout << "QWQ" << endl;
const int INF = 1000000000;
using namespace std;
int n, m, dis[N + 10][N + 10], s, t, k;
int min(int x, int y) {return ((x < y) ? (x) : (y));}
int max(int x, int y) {return ((x > y) ? (x) : (y));}
void ready() {
	for(int p = 1; p <= 200; p++)
		for(int i = 1; i <= 200; i++)
			if(p != i) dis[p][i] = INF;
}
void init() {
	ready();
	scanf("%d%d%d", &n, &m, &k), n++, s = n * 2 + 1, t = n * 2 + 2;
	for(int p = 1, x, y, z; p <= m; p++) {
		scanf("%d%d%d", &x, &y, &z), x++, y++;
		dis[x][y] = dis[y][x] = min(dis[x][y], z);
	}
}
void floyd() {
	for(int p = 1; p <= n; p++)
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++)
				if(p < i || p < j)
					dis[i][j] = min(dis[i][j], dis[i][p] + dis[p][j]);
}
struct node {
	int to, val, ro, next;
} gra[M * 2 + 10];
int head[M * 2 + 10], tot = 1;
void link(int x, int y, int z, int R) {
	gra[++tot].to = y, gra[tot].val = z, gra[tot].ro = R, gra[tot].next = head[x], head[x] = tot;
	gra[++tot].to = x, gra[tot].val = -z, gra[tot].ro = 0, gra[tot].next = head[y], head[y] = tot;
}
void connect() {
	link(s, 1, 0, k);
	for(int p = 1; p <= n; p++) {
		if(p != 1) link(s, p, 0, 1);
		link(p + n, t, 0, 1);
	}
	for(int p = 1; p <= n; p++)
		for(int i = p + 1; i <= n; i++)
			if(dis[p][i] != INF)
				link(p, i + n, dis[p][i], INF);
}
int d[N + 10], pre[N + 10], over[N + 10];
bool vis[N + 10];
int maxn = 0, minn = 0;
void mcmf() {
	while(1) {
		queue <int> que;
	    que.push(s);
	    memset(d, 0x7f, sizeof(d));
	    memset(vis, 0, sizeof(vis));
	    int INF = d[0];
	    vis[s] = 1, d[s] = 0, over[s] = 0x7f7f7f7f;
	    while(!que.empty()) {
	        int fr = que.front(); que.pop();
	        vis[fr] = 0;
	        for(int p = head[fr]; p; p = gra[p].next) {
	            int v = gra[p].to, w = gra[p].val;
	            if(gra[p].ro && d[v] > d[fr] + w) {
	                d[v] = d[fr] + w;
	                pre[v] = p, over[v] = min(over[fr], gra[p].ro);
	                if(!vis[v]) {
	                    vis[v] = 1;
	                    que.push(v);
	                }
	            }
	        }
	    }
	    if(d[t] == INF) break;
		int now = t;
	    while(now != s) {
	        int pr = pre[now];
	        gra[pr].ro -= over[t];
	        gra[pr ^ 1].ro += over[t];
	        now = gra[pr ^ 1].to;
	    }
	    maxn += over[t];
	    minn += over[t] * d[t];
	}
}
signed main() {
	init(), floyd(), connect();
	mcmf();
    printf("%d", minn);
}

我看题解里面的好多都是这样写的费用流,但是为啥我 70pts 3 点 T 啊/kk
求助 awa

2021/6/13 10:55
加载中...