社区讨论
萌新求助 TLE 只有70
P3376【模板】网络最大流参与者 3已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mi7patv4
- 此快照首次捕获于
- 2025/11/21 01:24 4 个月前
- 此快照最后确认于
- 2025/11/21 01:24 4 个月前
刚接触dinic
不是很懂优化
求大佬帮忙
CPP//Dinic
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define INF 0x3fffffff
inline int read() {
int x = 0,f = 1;
char ch = getchar();
while(ch<'0'||ch>'9') { if(ch=='-') f = -1; ch = getchar(); }
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x * f;
}
struct point{
int fr,to,val;
int nxt;
}edge[N];
int cur[N];//听说可以弧优化
int head[N];
int cnt;
void add_edge(int x,int y,int z)
{
edge[cnt].fr=x,edge[cnt].to=y,edge[cnt].val=z;
edge[cnt].nxt=head[x],head[x]=cnt++;
edge[cnt].fr=y,edge[cnt].to=x,edge[cnt].val=0;
edge[cnt].nxt=head[y],head[y]=cnt++;
}
//我放弃链式前向星
int n,m,st,ed;
int deep[N];
int BFS()
{
queue<int>q;
for(int i=0;i<=n;i++) cur[i]=head[i],deep[i]=0;
q.push(st);
deep[st]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].nxt)
{
int tmp=edge[i].to;
if(edge[i].val<=0 || deep[tmp]) continue;
deep[tmp]=deep[u]+1;
q.push(tmp);
}
}
return deep[ed];
}
int ans;
int dfs(int u,int flow)//flow为到达终点最多能增广的值
{
if(u==ed) return flow;
int add=0;
for(int i=cur[u];i!=-1&&add<flow;i=edge[i].nxt)
{
cur[u]=i;
int v=edge[i].to;
if(deep[v]!=deep[u]+1) continue;
if(!edge[i].val) continue;//剪枝
int tmpadd=dfs(v,min(edge[i].val,flow-add));
edge[i].val-=tmpadd;
edge[i^1].val+=tmpadd;//sub
add+=tmpadd;
}
return add;
}
void Dinic()
{
while(BFS()) ans+=dfs(st,INF);
}
int main()
{
n=read(),m=read(),st=read(),ed=read();
memset(head,-1,sizeof(head));
for(int i=1,u,v,co;i<=m;i++)
{
u=read(),v=read(),co=read();
add_edge(u,v,co);
}
Dinic();
printf("%d\n",ans);
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...