社区讨论
原始对偶 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 条回复,欢迎继续交流。
正在加载回复...