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("\n");
    }
}

  

posted @ 2018-08-02 22:52  断腿三郎  阅读(132)  评论(0编辑  收藏  举报