POJ 1459 Power Network 最大流dinic
http://poj.org/problem?id=1459
增加一个一个源点和一个汇点 然后连接。。。。
代码:
#include<iostream> #include<string> #include<cstdlib> #include<queue> #include<cstring> #include<cstdio> #define inf 10000000 #define Min(a,b)a<b?a:b using namespace std; int map[104][104],level[104]; int s,t,n,np,nc,m; int bfs() { int tt,i; memset(level,-1,sizeof(level)); queue<int>qu; qu.push(n); level[n]=0; while(!qu.empty()) { tt=qu.front(); qu.pop(); for( i=0;i<n+2;i++) if(map[tt][i]>0&&level[i]==-1) { level[i]=1+level[tt];//找了N年MD居然是这里level[i]+=level[tt]; qu.push(i); } } if(level[n+1]!=-1)return 1; else return 0; } int dfs(int x,int Cap) { if(x==n+1)return Cap; int temp=Cap,tt,i; for( i=0;i<n+2;i++) { if(level[i]==level[x]+1&&temp&&map[x][i]>0) { tt=dfs(i,Min(temp,map[x][i])); map[x][i]-=tt; map[i][x]+=tt; temp-=tt; } } return Cap-temp; } int dinic() { int SUM=0; while(bfs()) { SUM+=dfs(n,inf); } return SUM; } int main() { while(~scanf("%d%d%d%d",&n,&np,&nc,&m)) { int u,v,w; memset(map,0,sizeof(map)); while(m--) { scanf(" (%d,%d)%d",&u,&v,&w); map[u][v]=w; } while(np--) { int u,w; scanf(" (%d)%d",&u,&w); map[n][u]=w;//令 n为源点 } while(nc--) { int u,w; scanf(" (%d)%d",&u,&w); map[u][n+1]=w; } printf("%d\n",dinic()); } return 0; }