Dinic,88 ,wa最后一个,蒟蒻求助QAQ
查看原帖
Dinic,88 ,wa最后一个,蒟蒻求助QAQ
640808
chat楼主2022/11/28 13:06
/*


*/


/*
对题目的理解:

*/
#include<bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
#define int long long

const int maxn=2e7;
struct edge{
    int v;
    int c;
    int next;
}e[maxn];
int head[maxn];
int ind=1;
void add(int a,int b,int c){
    e[++ind]={b,c,head[a]};
    head[a]=ind;
}

int d[maxn];//分层
int cur[maxn];//弧优化
int n,m;//
int s=1,t;
bool bfs(){
    memset(d,0,sizeof d);
    d[s]=1;
    queue<int> q;
    q.push(s);
    while(q.size()){
        int u=q.front();
        q.pop();
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].v;
            if(d[v]==0 && e[i].c){
                d[v]=d[u]+1;
                q.push(v);
                if(v==t)    return true;
            }
        }
    }
    return false;
}

int dfs(int u,int maxfloor){
    if(u==t)    return maxfloor;
    int sum=0;
    for(int i=cur[u];i;i=e[i].next){
        cur[u]=i;//弧优化
        int v=e[i].v;
        if(d[v]==d[u]+1 && e[i].c){
            int f=dfs(v,min(maxfloor,e[i].c));
            sum+=f;
            e[i].c-=f;
            e[i^1].c+=f;
            maxfloor-=f;
            if(maxfloor==0) break;
        }
    }
    if(sum==0)  d[u]=0;
    return sum;
}

int Dinic(){
    int flow=0;
    while(bfs()){
        memcpy(cur,head,sizeof head);
        flow+=dfs(s,inf);
    }
    return flow;
}
int a[maxn];
int b[maxn];
int c;
signed main()
{
    cin>>n>>m;
    t=n;

    for(int i=1;i<=m;i++){
       cin>>a[i]>>b[i]>>c;
       add(a[i],b[i],c);
       add(b[i],a[i],0);
    }
    cout<<Dinic()<<" ";
    //最少卡车数也就是最少的割边数
    ind=1;
    memset(head,0,sizeof head);
    for(int i=1;i<=m;i++){
        add(a[i],b[i],1);
        add(b[i],a[i],0);
    }
    cout<<Dinic()<<endl;
    system("pause");
	return 0;
}

2022/11/28 13:06
加载中...