zoukankan      html  css  js  c++  java
  • POJ1273(网络流)

    裸裸的最大流模板题。

    View Code
    /*Source Code
    Problem: 1273  User: HEU_daoguang 
    Memory: 704K  Time: 0MS 
    Language: G++  Result: Accepted 
    Source Code*/ 
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    using namespace std;
    int m,n;
    
    #define V 250
    #define E 400500
    #define inf 10050000
    struct Edge{
        int u,v,c,next;
    }edge[E];
    int cnt;
    int dist[V];
    int head[V];
    int que[V];
    int sta[V];
    
    void init(){
        cnt=0;
        memset(head,-1,sizeof(head));
    }
    
    void addedge(int u,int v,int c){
        edge[cnt].u=u;edge[cnt].v=v;edge[cnt].c=c;
        edge[cnt].next=head[u];head[u]=cnt++;
        edge[cnt].u=v;edge[cnt].v=u;edge[cnt].c=0;
        edge[cnt].next=head[v];head[v]=cnt++;
    }
    
    int dinic(int s,int t){
        int ans=0;
        while(true){
    
            int left,right,u,v;
            memset(dist,-1,sizeof(dist));
            left=right=0;
            que[right++]=s;
            dist[s]=0;
    
            while(left<right){
                u=que[left++];
                for(int k=head[u];k!=-1;k=edge[k].next){
                    u=edge[k].u;
                    v=edge[k].v;
                    if(edge[k].c>0 && dist[v]==-1){
                        dist[v]=dist[u]+1;
                        que[right++]=v;
    
                        if(v==t){
                            left=right;
                            break;
                        }
                    }
                }
    
            }
    
            if(dist[t]==-1) break;
    
            int top=0;
            int now=s;
            while(true){
                if(now!=t){
                    int k;
                    for(k=head[now];k!=-1;k=edge[k].next){
                        if(edge[k].c>0 && dist[edge[k].v]==dist[edge[k].u]+1) break;
                    }
                    if(k!=-1){
                        sta[top++]=k;
                        now=edge[k].v;
                    }
                    else{
                        if(top==0) break;
                        dist[edge[sta[--top]].v]=-1;
                        now=edge[sta[top]].u;
                    }
                }
                else{
                    int flow=inf,ebreak;
                    for(int i=0;i<top;i++){
                        if(flow>edge[sta[i]].c){
                            flow=edge[sta[i]].c;
                            ebreak=i;
                        }
                    }
                    ans+=flow;
                    for(int i=0;i<top;i++){
                        edge[sta[i]].c-=flow;
                        edge[sta[i]^1].c+=flow;
                    }
                    now=edge[sta[ebreak]].u;
                    top=ebreak;
                }
            }
    
        }
        return ans;
    }
    
    int main()
    {
        int a,b,c;
        //freopen("in.txt","r",stdin);
        while(scanf("%d%d",&m,&n)!=EOF){
            init();
            for(int i=1;i<=m;i++){
                scanf("%d%d%d",&a,&b,&c);
                addedge(a,b,c);
            }
            printf("%d\n",dinic(1,n));
        }
        return 0;
    }
  • 相关阅读:
    Saltstack module gem 详解
    Saltstack module freezer 详解
    Saltstack module firewalld 详解
    Saltstack module file 详解
    Saltstack module event 详解
    Saltstack module etcd 详解
    Saltstack module environ 详解
    Saltstack module drbd 详解
    Saltstack module dnsutil 详解
    获取主页_剥离百度
  • 原文地址:https://www.cnblogs.com/markliu/p/2510787.html
Copyright © 2011-2022 走看看