POJ1459 Power Network 最大流

http://poj.org/problem?id=1459

最大流(dinic)问题,开始因为多开了一个数组,多进行了一次memset一直超时。

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int N=205,inf=1e8;
int src=103,tar=104,n,np,nc,m;
int First[N],Next[N*N*2],V[N*N*2],W[N*N*2],cnt;
int vis[N],dep[N];
inline void init(){
    memset(First,0,sizeof(First));
    cnt=1;src=n+1;tar=n+2;
}
inline void add(int u,int v,int w){
    Next[++cnt]=First[u];
    First[u]=cnt;
    V[cnt]=v;W[cnt]=w;
    Next[++cnt]=First[v];
    First[v]=cnt;
    V[cnt]=u;W[cnt]=0;
}
void bfs(){
    memset(dep,0,sizeof(dep));
    queue<int>q;
    q.push(src);
    dep[src]=1;
    while(!q.empty()){
        int now=q.front();
        q.pop();
        for(int i=First[now];i;i=Next[i]){
            int v=V[i],w=W[i];
            if(dep[v]==0&&w){
                q.push(v);
                dep[v]=dep[now]+1;
            }
        }
    }
}
int dfs(int now,int delta){
    //printf("*%d\n",delta);
    int ans=0;
    if(now==tar||delta==0) return delta;
    for(int i=First[now];i;i=Next[i]){
        int v=V[i],w=W[i];
        if(w>0&&dep[v]==dep[now]+1){
            int dd=dfs(v,min(delta,w));
            W[i]-=dd;
            W[i^1]+=dd;
            delta-=dd;
            ans+=dd;
            if(!delta) break;
        }
    }
    if(ans) return ans;
    dep[now]=-1;return 0;
}
int dinic(){
    int ans=0,tt;
    while(1){
        bfs();
        if(dep[tar]==0) return ans;
        while(tt=dfs(src,inf))
        ans+=tt;
    }
}
int main(){
    while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF){
        int x,y,c;
        init();
        for(int i=0;i<m;i++){
            scanf(" (%d,%d)%d",&x,&y,&c);
            add(x,y,c);
        }
        for(int i=0;i<np;i++){
            scanf(" (%d)%d",&x,&c);
            add(src,x,c);
        }
        for(int i=0;i<nc;i++){
            scanf(" (%d)%d",&x,&c);
            add(x,tar,c);
        }
        printf("%d\n",dinic());
    }
} 

 

posted on 2020-08-12 15:45  学无止境的小程序员  阅读(98)  评论(0编辑  收藏  举报

导航