1. 程式人生 > 實用技巧 >POJ1459 Power Network 最大流

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