社区讨论
求助dinic过不了样例2
P4722【模板】最大流 加强版 / 预流推进参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m0hhqmhe
- 此快照首次捕获于
- 2024/08/31 09:55 2 年前
- 此快照最后确认于
- 2025/11/04 21:58 4 个月前
rt
样例
CPP样例
10 16 1 2
1 3 2
1 4 2
5 2 2
6 2 2
3 5 1
3 6 1
4 5 1
4 6 1
1 7 2147483647
9 2 2147483647
7 8 2147483647
10 9 2147483647
8 5 2
8 6 2
3 10 2
4 10 2
代码
CPP#include <bits/stdc++.h>
#define min(a,b) a<b?a:b
using namespace std;
typedef long long ll;
const int MAXN=2e6;
const ll inf=1e15;
int cnt,S,T,n,m,head[MAXN],to[MAXN],nxt[MAXN],dep[MAXN];
ll cap[MAXN];
namespace flow {
void add(int x,int y,ll w) {
to[++cnt]=y,cap[cnt]=w;
nxt[cnt]=head[x],head[x]=cnt;
}
void add_edge(int x,int y,ll w) {
add(x,y,w);
add(y,x,0);
}
void init() {
for(int i=1; i<=cnt; i++) head[i]=0;
cnt=1;
}
bool bfs() {
queue<int> q;
for(int i=S; i<=T+1; i++) dep[i]=-1;
q.push(S),dep[S]=0;
while(!q.empty()) {
int x=q.front();
q.pop();
for(int i=head[x]; i; i=nxt[i]) {
int y=to[i];
if(dep[y]!=-1||cap[i]==0) continue;
dep[y]=dep[x]+1;
q.push(y);
}
}
return (dep[T]!=-1);
}
ll dfs(int x,ll lim) {
if(x==T) return lim;
if(lim==0) return 0;
ll ans=0;
for(int i=head[x]; i; i=nxt[i]) {
int y=to[i];
if(dep[x]+1!=dep[y]||cap[i]==0) continue;
ll Min=dfs(y,min(lim,cap[i]));
cap[i]-=Min,lim-=Min;
cap[1^i]+=Min,ans+=Min;
if(lim==0) break;
}
return ans;
}
ll sol() {
ll ans=0;
while(bfs()) ans+=dfs(S,inf);
return ans;
}
}
int main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m>>S>>T;
flow::init();
for(int i=1; i<=m; i++) {
int x,y,z;
cin>>x>>y>>z;
flow::add_edge(x,y,z);
}
cout<<flow::sol()<<'\n';
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...