社区讨论

原始对偶 63pts

P3381【模板】最小费用最大流参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo1u8cpd
此快照首次捕获于
2023/10/23 03:04
2 年前
此快照最后确认于
2023/11/03 03:36
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline void read(int& a) {
    int s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')
            w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    a = s * w;
}
inline void write(int x) {
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
    return;
}
struct node {
    int v, nxt, dis;
    int w;
} e[4000100];
int n, m, s, t;
int dis[200010], pre[200010];
int hd[200010];
int ep[200010];
bool vis[200010];
int flow[200010];
int tot;
int Max_Flow, Min_Cost;
int zy,zyd;
void add_edge(int u, int v, long long w, int d) {
	//cout<<u<<" "<<v<<" "<<w<<" "<<d<<endl; 
    e[++tot].v = v;
    e[tot].w = w;
    e[tot].nxt = hd[u];
    hd[u] = tot;
    e[tot].dis = d;
    e[++tot].v = u;
    e[tot].w = 0;
    e[tot].nxt = hd[v];
    e[tot].dis = -d;
    hd[v] = tot;
}
bool dijkstra() {
//	cout<<n<<endl;
    for (int i = 1; i <= n; i++) dis[i] = 1e18;
    for (int i = 1; i <= n; i++) vis[i] = 0;
    set<pair<int,int> > st;
    dis[s]=0;
    st.insert(make_pair(0,s));
   // for(int i=1;i<=n;i++) cout<<ep[i]<<" ";
    while(!st.empty()){
    	int u=st.begin()->second;
    	st.erase(st.begin());
    	if(vis[u]) continue;
    	vis[u]=1;
    	for(int j=hd[u];j;j=e[j].nxt){
    		if(e[j].w>0){
    			if(dis[e[j].v]>(dis[u]+e[j].dis+ep[u]-ep[e[j].v])){
    				pre[e[j].v]=j;
    				dis[e[j].v]=dis[u]+e[j].dis+ep[u]-ep[e[j].v];
    				st.insert(make_pair(dis[e[j].v],e[j].v));
				}
			}
		}
	}
	//cout<<dis[t]<<endl;
    return dis[t] != 1e18;
}

void PD() {
	for(int i=1;i<=n;i++) ep[i]=1e18;
	ep[s]=0;
	queue<int> q;
	q.push(s);
	vis[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=hd[u];i;i=e[i].nxt){
			if(e[i].w!=0&&ep[e[i].v]>ep[u]+e[i].w){
				ep[e[i].v]=ep[u]+e[i].w;
				if(vis[e[i].v]==0) q.push(e[i].v),vis[e[i].v]=1;
			}
		}
	}
    while (dijkstra()) {
		
    	for(int i=1;i<=n;i++) ep[i]+=dis[i];
    	int fl=1e18;
    	for(int x=t;x!=s;x=e[pre[x]^1].v){
    		fl=min(fl,e[pre[x]].w);
		}
		Max_Flow+=fl;
		Min_Cost+=fl*ep[t];
//		cout<<fl<<endl;
        for(int x=t;x!=s;x=e[pre[x]^1].v){
    		e[pre[x]].w-=fl;
    		e[pre[x]^1].w+=fl;
		}
    }
}
int a[200010],b[200010],c[200010];
signed main() {
    tot = 1;
    cin>>n>>m>>s>>t;
    for(int i=1;i<=m;i++){
    	int u,v,w,c;
    	cin>>u>>v>>w>>c;
    	add_edge(u,v,w,c);
	}
    PD();
	write(Max_Flow);
    putchar(' ');
    write(Min_Cost);
    
    return 0;
}

TLE 8# 10#
WA 9# 11#

回复

0 条回复,欢迎继续交流。

正在加载回复...