dinic算法0分,全部re
查看原帖
dinic算法0分,全部re
507534
YBaggio楼主2022/6/12 08:25

本地运行答案是对的

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=100010;
int n,m,s,t,dep[maxn],head[maxn],cnt=1;
struct E{
    int to,next,w;
}edge[maxn];
void add(int u,int v,int w){
    edge[++cnt].to=v;edge[cnt].next=head[u];head[u]=cnt;
    edge[cnt].w=w;
}
bool bfs(){
    memset(dep,0,sizeof(dep));
    queue<int>q;q.push(s);dep[s]=1;
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=head[u];i;i=edge[i].next){
            if(!dep[edge[i].to]&&edge[i].w){
                dep[edge[i].to]=dep[u]+1;
                q.push(edge[i].to);
            }
        }
    }
    return dep[t];
}
int dfs(int x,int dist){
    if(x==t)return dist;
    int flow=0;
    for(int i=head[x];i&&dist;i=edge[i].next){
        int y=edge[i].to;
        if(dep[y]==dep[x]+1&&edge[i].w){
            int res=dfs(y,min(dist,edge[i].w));
            edge[i].w-=res;
            edge[i^1].w+=res;
            dist-=res;flow+=res;
        }
    }
    if(!flow)dep[x]=-2;
    return flow;
}
int dinic(){
    int ans=0;
    while(bfs())ans+=dfs(s,inf);
    return ans;
}
int main(){
    scanf("%d%d",&m,&n);s=0;t=n+1;
    for(int x,y;x!=-1&&y!=-1;scanf("%d%d",&x,&y))add(x,y,inf),add(y,x,0);
    for(int i=1;i<=m;i++)add(s,i,1),add(i,s,0);
    for(int i=m+1;i<=n;i++)add(i,t,1),add(t,i,0);
    printf("%d\n",dinic());
    for(int i=2;i<=cnt;i+=2){
        if(edge[i].to==s||edge[i^1].to==s)continue;
        if(edge[i].to==t||edge[i^1].to==t)continue;
        if(edge[i^1].w!=0){
            printf("%d %d\n",edge[i^1].to,edge[i].to);
        }
    }
    return 0;
}
2022/6/12 08:25
加载中...