【1.04s】MnZn求助极限卡常!!!
查看原帖
【1.04s】MnZn求助极限卡常!!!
551861
strcmp楼主2022/3/25 23:50
#include <bits/stdc++.h>
using namespace std;
#define inf 2147483647
#define V 405
#define E 30010
#pragma optimize(1)
#pragma optimize(2)
#pragma optimize(3,"Ofast","inline")
typedef long long int ll;
struct edge { int to, next, capa, cost; };
int cnt = 0, head[V], n, m; edge node[E];
inline void add(register int fir, register int nxt, register int w, register int c) {
	node[cnt].to = nxt,
		node[cnt].capa = w,
		node[cnt].cost = c,
		node[cnt].next = head[fir],
		head[fir] = cnt++;
}
int s, t, cur[V]; deque<int>que; ll dep[V], sum = 0, cost = 0, num = 0;
bool vis[V];
inline bool spfa() {
	for (register int i = 1; i <= n; ++i)dep[i] = inf;
	dep[s] = 0; que.push_back(s); register int u, v;
	while (!que.empty()) {
		v = que.front();
		while (dep[v] * que.size() > num)que.pop_front(), que.push_back(v), v = que.front();
		que.pop_front();
		for (register int i = head[v]; i != -1; i = node[i].next) {
			u = node[i].to;
			if (dep[v] + node[i].cost < dep[u] && node[i].capa) {
				dep[u] = dep[v] + node[i].cost;
				if (!que.empty() && dep[u] < dep[que.front()])que.push_front(u);
				else que.push_back(u);
				num += dep[u];
			}
		}
	}
	return (dep[t] != inf);
}
ll dfs(register int v, register int flow) {
	if (v == t || flow == 0)return flow; register int used = 0, wei = 0; vis[v] = true;
	for (register int i = cur[v]; i != -1; i = node[i].next) {
		cur[v] = i;
		if (!vis[node[i].to] && dep[node[i].to] == dep[v] + node[i].cost && node[i].capa) {
			wei = dfs(node[i].to, min(flow - used, node[i].capa));
			if(wei){
			    node[i].capa -= wei,
			    node[i ^ 1].capa += wei,
			    used += wei,
			    cost += node[i].cost * wei;
			}
		}
		if (used == flow) {
			vis[v] = false;
			return used;
		}
	}
	vis[v] = false;
	return used;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(); cout.tie();
	memset(head, -1, V * sizeof(int));
	cin>>n>>m; s = 1, t = n;
	int f, l, w, c;
	for (register int i = 0; i < m; ++i) {
		cin>>f>>l>>w>>c;
		add(f, l, w, c);
		add(l, f, 0, -c);
	}
	while (spfa()) {
		memcpy(cur, head, (n + 1) * sizeof(int));
		sum += dfs(s, inf);
	}
	cout << sum << " " << cost;
	return 0;
}

多路增广费用流,最大的点跑了 1.04s

2022/3/25 23:50
加载中...