zoukankan      html  css  js  c++  java
  • ZOJ 1532 Internship (Dinic)

    看来模板又错了,敲你妈妈小饼干

    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<stack>
    #include<vector>
    #include<map>
    using namespace std;
    const int inf = 0x3f3f3f3f ;
    struct node {
        int u,v,Flow,next;
    };
    
    
    
    node Li[3000];
    int Head[110],top;
    int vis[110],ans[110];
    bool vis1[110],vis2[110];
    int n,m,l;
    int s,t;
    void Add(int u,int v,int f) {
        Li[top].v=v;
        Li[top].u=u;
        Li[top].Flow=f;
        Li[top].next=Head[u];
        Head[u]=top++;
    }
    bool BFS() {
        memset(vis,-1,sizeof(vis));
        vis[s]=0;
        queue<int>q;
        q.push(s);
        while(!q.empty()) {
            int u=q.front();
            q.pop();
            for(int i=Head[u]; i!=-1; i=Li[i].next) {
                if(Li[i].Flow&&vis[Li[i].v]==-1) {
                    vis[Li[i].v]=vis[u]+1;/**为何要如此标记?改**/
                    q.push(Li[i].v);
                }
            }
        }
        return vis[t]!=-1;
    }
    int DFS(int u,int f) {
        if(u==t) {
            return f;
        }
        int ans=0;
        for(int i=Head[u]; i!=-1; i=Li[i].next) {
            if(Li[i].Flow&&vis[Li[i].v]==vis[u]+1) {
                int d=DFS(Li[i].v,min(f,Li[i].Flow));
                f-=d;
                Li[i].Flow-=d;
                Li[i^1].Flow+=d;//神奇呀!!!!!!
                ans+=d;
            }
        }
        return ans;
    }
    void dfs(int u,bool *vist,int op) {
        vist[u]=true;
        for(int i=Head[u]; i!=-1; i=Li[i].next) {
            if(!vist[Li[i].v]&&Li[i^op].Flow!=0) {
                dfs(Li[i].v,vist,op);
            }
        }
    }
    void Dinic() {
        int ans;
        while(BFS()) {
            ans=DFS(s,inf);
        }
    }
    int main() {
        while(scanf("%d%d%d",&n,&m,&l)!=EOF&&n) {
            s=n+m+1;
            t=0;
            memset(Head,-1,sizeof(Head));
            int a,b,c;
            top = 0;
            for(int i=0; i<l; i++) {
                scanf("%d%d%d",&a,&b,&c);
                Add(a,b,c);
                Add(b,a,0);
            }
            for(int i=1; i<=n; i++) {
                Add(s,i,inf);
                Add(i,s,0);
            }
            Dinic();
            memset(vis1,0,sizeof(vis1));
            memset(vis2,0,sizeof(vis2));
            dfs(s,vis1,0);
            dfs(t,vis2,1);
            int num = 0;
            for(int i=0; i<l; i++) {
                if(Li[i<<1].Flow==0){
                    Li[i<<1].Flow=1;
                    if(BFS())ans[num++]=i+1;
                    Li[i<<1].Flow=0;
    
                }
            }
            if(num) {
                for(int i=0; i<num; i++) {
                    if(i) {
                        printf(" ");
                    }
                    printf("%d",ans[i]);
                }
            }
            printf("
    ");
        }
    }
    

      

  • 相关阅读:
    url参数的获取
    ajax变量作用域的问题
    滚动条自适应宽度的问题
    js发送验证码(倒计时)
    字符串
    值类型和引用类型
    面向对象
    进程
    UI事件
    鼠标跟随
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/9410738.html
Copyright © 2011-2022 走看看