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