P3376 網絡最大流 【模板】

..忽然發現本身拖了好久都沒有學習有關網絡流的東西了,因此先從模板開始寫起吧.ios

dinic網絡

code:ide

#include<iostream>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
const int MAXN = 1e6+5;
struct side{
    int from,to,next,w;
}edge[MAXN];
int head[MAXN],depth[MAXN],n,m,s,t,len=-1;
using namespace std;
void ins(int x,int y,int d)
{
    //利用結構體的賦值
    edge[++len]=
    (side){x,y,head[x],d};
    head[x]=len;
}
int bfs()
{
    queue<int>q;
    fill(depth,depth+1+n,0);
    depth[s]=1;q.push(s);
    while(q.size())
    {
        int now=q.front(); q.pop();
        for(int k=head[now];k!=-1;k=edge[k].next){
            //下一層未被訪問
            if(edge[k].w>0&&depth[edge[k].to]==0){
                depth[edge[k].to]=depth[now]+1;
                q.push(edge[k].to);
            }

        }

    }
    //在未更新到匯點以前
    return depth[t]!=0;
}
int dfs(int now,int flow)
{
    //匯點中止
    if(now==t) return flow;
    for(int k=head[now];k!=-1;k=edge[k].next)
        //流量大於0,切不是往回流
        if(edge[k].w>0&&depth[edge[k].to]==depth[now]+1)
        {
            int minflow=dfs(edge[k].to,min(flow,edge[k].w));
            if(minflow>0)
            {
                edge[k].w-=minflow;
                edge[k^1].w+=minflow;
                return minflow;
            }
        }
    return 0;
}
int dinic(int ans=0)
{
//在bfs廣搜下進行深搜
    while(bfs())
        while(int flow=dfs(s,INF)) ans+=flow;
    return ans;
}
int main()
{
    cin>>n>>m>>s>>t;
    fill(head,head+1+n,-1);
    for(int x,y,d,i=1;i<=m;i++){
        cin>>x>>y>>d;
        ins(x,y,d);//正向建邊
        ins(y,x,0);//反向建邊
    }

    cout<<dinic();
}
相關文章
相關標籤/搜索