社区讨论

2,9,10点WA了,求查错

P3376【模板】网络最大流参与者 19已保存回复 21

讨论操作

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

当前回复
21 条
当前快照
1 份
快照标识符
@mi6gxf2s
此快照首次捕获于
2025/11/20 04:42
4 个月前
此快照最后确认于
2025/11/20 05:10
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;

const int MAXN=10010;
const int MAXM=100010;
const int INF=0x7fffffff;

struct Edge
{
    int to,f;
    int next;
} edge[MAXM];

int n,m,cnt,s,t;

int first[MAXN],level[MAXN];

int q[MAXN];


void init()
{
    cnt=0;
    memset(first,-1,sizeof(first));
}

void add(int u, int v, int f)
{
    edge[cnt].to=v,edge[cnt].f=f;
    edge[cnt].next=first[u],first[u]=cnt++;
    edge[cnt].to=u,edge[cnt].f=0;//增加一条反向弧,容量为0
    edge[cnt].next=first[v],first[v]=cnt++;
}

int bfs(int s,int t) //构建层次网络
{
    memset(level,0,sizeof(level));
    level[s]=1;
    int front=0,rear=1;
    q[front]=s;
    while(front<rear)
    {
        int x=q[front++];
        if(x==t) return 1;
        for(int e=first[x];e!=-1;e=edge[e].next)
        {
            int v=edge[e].to,f=edge[e].f;
            if(!level[v]&&f)
            {
                level[v]=level[x]+1;
                q[rear++]=v;
            }
        }
    }
    return 0;
}

int dfs(int u,int maxf,int t)
{
    if(u==t) return maxf;
    int ret=0;
    for(int e=first[u];e!=-1;e=edge[e].next)
    {
        int v=edge[e].to,f=edge[e].f;
        if(level[u]+1==level[v]&&f)
        {
            int Min=min(maxf-ret,f);
            f=dfs(v,Min,t);
            edge[e].f-=f;
            edge[e^1].f+=f;
            ret+=f;
            if(ret==maxf) return ret;
        }
    }
    return ret;
}

int Dinic()
{
    int ans=0;
    while(bfs(s,t)) ans+=dfs(s,INF,t);
    return ans;
}

int main()
{
    scanf("%d%d%d%d",&n,&m,&s,&t);
    init();
    for(int i=1,u,v,w;i<=m;++i)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    printf("%d",Dinic());
    return 0;
}

回复

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

正在加载回复...