1. 程式人生 > >【最大流】hihocoder 1369 : 網絡流一·Ford-Fulkerson算法

【最大流】hihocoder 1369 : 網絡流一·Ford-Fulkerson算法

max problem cstring PE empty AD 算法 def sizeof

http://hihocoder.com/problemset/problem/1369?sid=1328132

參考 https://blog.csdn.net/a1799342217/article/details/73195243

https://blog.csdn.net/a519781181/article/details/51908303

【AC1】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include
<queue> #include<map> using namespace std; typedef long long ll; int n,m; const int maxn=5e2+2; const int maxm=2e4+2; const int inf=0x3f3f3f3f; int maxflow; struct edge{ int to; int nxt; int w; }e[2*maxm]; int head[maxn]; int tot; int fa[maxn]; int mp[maxn][maxn]; bool vis[maxn];
void init(){ memset(mp,-1,sizeof(mp)); memset(head,-1,sizeof(head)); tot=0; maxflow=0; } void add(int u,int v){ e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } bool bfs(int s,int t){ memset(vis,false,sizeof(vis)); memset(fa,-1,sizeof(fa)); queue<int> Q; Q.push(s);
while(!Q.empty()){ int u=Q.front(); Q.pop(); if(u==t) return true; if(vis[u]) continue; vis[u]=true; for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; if(!vis[v]&&mp[u][v]){ fa[v]=u; Q.push(v); } } } return false; } int max_flow(int s,int t){ int flow=0; // int cnt=0; while(bfs(s,t)){ // for(int i=1;i<=n;i++){ // for(int j=1;j<=n;j++){ // cout<<mp[i][j]<<" "; // } // cout<<endl; // } // cout<<"**********************"<<endl; // cnt++; int u=t; int delta=inf; while(fa[u]!=-1){ // cout<<u<<" "; delta=min(delta,mp[fa[u]][u]); u=fa[u]; } // cout<<endl; // cout<<delta<<endl; flow+=delta; u=t; while(fa[u]!=-1){ mp[fa[u]][u]-=delta; mp[u][fa[u]]+=delta; u=fa[u]; } } return flow; } int main(){ while(~scanf("%d%d",&n,&m)){ init(); int u,v,c; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&c); if(mp[u][v]==-1){ add(u,v); add(v,u); mp[u][v]=c; mp[v][u]=0; }else{ mp[u][v]+=c; } } int ans=max_flow(1,n); printf("%d\n",ans); } return 0; }

【AC2】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
int n,m;
const int maxn=5e2+2;
const int maxm=2e4+2;
const int inf=0x3f3f3f3f;
struct edge{
    int to;
    int nxt;
    int w;
}e[maxm<<1];
int head[maxn];
struct node{
    int x;
    int e;
}fa[maxn]; 


bool vis[maxn];
int tot;
void init(){
    memset(head,-1,sizeof(head));
    tot=0;
}
void add(int u,int v,int c){
    e[tot].to=v;
    e[tot].w=c;
    e[tot].nxt=head[u];
    head[u]=tot++;
}
bool bfs(int s,int t){
    memset(vis,false,sizeof(vis));
    queue<int> Q;
    Q.push(s);
    vis[s]=true;
    while(!Q.empty()){
        int u=Q.front();
        Q.pop();
        if(u==t) return true;
        for(int i=head[u];i!=-1;i=e[i].nxt){
            int v=e[i].to;
            int w=e[i].w;
            if(!vis[v]&&w){
                Q.push(v);
                vis[v]=true;
                fa[v].x=u;
                fa[v].e=i;
            }
        }
    }
    return false;
}
int work(){
    int s=1,t=n;
    for(int i=1;i<=n;i++){
        fa[i].e=-1;
        fa[i].x=-1;
    }
    int ans=0;
    while(bfs(s,t)){
        int delta=inf;
        int u=t;
        while(fa[u].x!=-1){
            delta=min(delta,e[fa[u].e].w);
            u=fa[u].x;
        }
        ans+=delta;
        u=t;
        while(fa[u].x!=-1){
            int i=fa[u].e;
            e[i].w-=delta;
            e[i^1].w+=delta;
            u=fa[u].x;
        }
        for(int i=1;i<=n;i++){
            fa[i].e=-1;
            fa[i].x=-1;
        }
    }
    return ans;
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        init();
        int u,v,c;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&u,&v,&c);
            add(u,v,c);
            add(v,u,0);
        }
        int ans=work();
        printf("%d\n",ans);
    }
    return 0;
}

【最大流】hihocoder 1369 : 網絡流一·Ford-Fulkerson算法