网络流典题,P4480AC代码在此RE+WA90分
查看原帖
网络流典题,P4480AC代码在此RE+WA90分
1309682
majoego楼主2024/5/7 22:29
// Author: Expert_Dream
// Copyright (c) 2024 Expert_Dream All rights reserved.
// Problem: P1251 ??????
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1251
// Memory Limit: 125 MB
// Time Limit: 4000 ms
// Date: 2024-05-06 21:02:20

// #pragma GCC optimize(2,3,"Ofast","inline")
#include<bits/stdc++.h>
// #include <atcoder/all>
#define ll long long
#define i128 __int128
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fs first
#define sc second
#define x0 _x0_
#define y1 _y1_
#define endl '\n'
#define re register
#define pb push_back
#define vi vector<int>
#define pq priority_queue
#define mem(a,x) memset((a),(x),sizeof(a))
#define debug puts("AK IOI")
#define sz(s) (int)(s.size())
#define all(a) a.begin(),a.end()
#define rd(l,r) (myrand()%(r-l+1)+l)
#define print(x) {cout<<x<<endl;return;}
#define For(x,y,z) for(int x = y;x <= z;x++)
#define For_(x,y,z) for(int x = y;x >= z;x--)
#define between(x, flo, top) (flo <= x && x <= top)
// #define double long double
using namespace std;
// using namespace atcoder;
//#define int long long
const int mod = 1e9+7;
//const int mod = 998244353;
mt19937 myrand(time(0));
const int N = 2e6+5,M = 2e6+5,K = 3000+5;
namespace FastIO {template <typename T = int>inline T read() {T s=0,w=1;char c=getchar();while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}while(isdigit(c))s=(s<<1)+(s<<3)+(c^48),c=getchar();return s*w;}template <typename T>inline void read(T &s){s=0;int w=1;char c=getchar();while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}while(isdigit(c))s=(s<<1)+(s<<3)+(c^48),c=getchar();s*=w;}template <typename T, typename... Args> inline void read(T &x, Args &...args) {read(x), read(args...);}template <typename T>inline void write(T x,char ch = '\n') {if(x<0)x=-x,putchar('-');static char stk[200];int top=0;do{stk[top++]=x%10+'0',x/=10;}while(x);while(top)putchar(stk[--top]);putchar(ch);return;}}
using namespace FastIO;
int n;int a[N];
namespace Dinic {
	int s, t;
	int head[M << 1], tot = 1 , mc = 0;
	bool vis[N];
	ll dis[N];
	ll cur[N], now[N];
	const int inf = 0x3f3f3f3f3f3f3f3f;
	struct node {
		int from, to, nxt, wt, cost, flow;
	} g[M << 1];
	inline void add(int u, int v, int w, int c) {
		g[++tot] = {u, v, head[u], w, c, 0},head[u] = tot;
		g[++tot] = {v, u, head[v], 0, -c, 0},head[v] = tot;
	}inline bool spfa() {
		deque<int> q;
		memset(dis,0x3f,sizeof dis);memset(vis,0,sizeof vis);
// 		For(i,1,n+n) dis[i]=inf,vis[i]=0;
		dis[t]=inf,vis[t]=0;
		dis[s] = 0; vis[s] = true;q.push_back(s);
		while(!q.empty()) {
			int u = q.front(); q.pop_front();
			now[u] = head[u]; vis[u] = false;
			for(int i = head[u]; i; i = g[i].nxt) {
				int v = g[i].to, w = g[i].wt, fl = g[i].flow, c = g[i].cost;
				if(w - fl && dis[v] > dis[u] + c) {
					dis[v] = dis[u] + c;
					if(!vis[v] ) {
						if(dis[v] > dis[q.front()]) q.push_back(v);
						else q.push_front(v);
						vis[v] = true;
					}
				}
			}
		}
		return dis[t] != inf;
	}
	inline int dfs(int u, int flow) {
		if(u == t || !flow) {
			vis[t] = true; return flow;
		}
		int res = 0; vis[u] = true;
		for(int i = now[u]; i; i = g[i].nxt) {	//
			now[u] = i;	//
			int v = g[i].to, w = g[i].wt, fl = g[i].flow, c = g[i].cost;
			if(dis[v] == dis[u] + c && w - fl > 0 && (!vis[v] || v == t)) {
				int d = dfs(v, min(flow - res, w - fl));
				if(d) res += d, g[i].flow += d, g[i ^ 1].flow -= d, mc += d * c;
				if(res == flow) break;
			}
		}
		vis[u]=false;
		return res;
	}
	inline ll dinic() {
		int mf = 0; mc = 0;
		while(spfa()) dfs(s, inf);
		
		return mc;
	}
}using namespace Dinic;

int id(int x,int y) {return x * 2 + y;}
void solve(){
	read(n);
	int p,m,f,nn,ss;read(m,nn,f,ss,p);
	s=n*2+2,t=s+1;
	For(i,1,n){
		read(a[i]);
	}
	For(i,1,n){
		add(s,id(i,0),inf,p);
		add(id(i,0),t,a[i],0);
		add(s,id(i,1),a[i],0);
		if(i+1<=n) add(id(i,0),id(i+1,0),inf,0);
		if(i+m<=n) add(id(i,1),id(i+m,0),inf,f);
		if(i+nn<=n) add(id(i,1),id(i+nn,0),inf,ss);
	}
	write(dinic());
}signed main(){
	// ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int T=1;
	// read(T);
	For(_,1,T) solve();
	return 0;
}
2024/5/7 22:29
加载中...