hdu 4292 网络流

2014-11-24 08:06:42 · 作者: · 浏览: 0
#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        using namespace std; const int inf=1<<29; const int maxn=2000,maxm=500000; #define min(a,b) a>b b:a struct edge { int v,f,nxt; }; bool vis[maxn+10]; //是否被访问 int dist[maxn+10]; //层数 int src,sink; int g[maxn+10]; int nume; edge e[maxm*2+10]; void add(int u,int v,int f) { e[++nume].v=v; e[nume].f=f; e[nume].nxt=g[u]; g[u]=nume; e[++nume].v=u; e[nume].f=0; e[nume].nxt=g[v]; g[v]=nume; } void bfs() { queue
       
        que; memset(dist,0,sizeof(dist)); while(!que.empty()) que.pop(); que.push(src); vis[src]=true; while(!que.empty()){ int u=que.front(),i; que.pop(); for(i=g[u]; i; i=e[i].nxt){ if(e[i].f&&!vis[e[i].v]){ que.push(e[i].v); dist[e[i].v]=dist[u]+1; vis[e[i].v]=true; } } } } int dfs(int u ,int delta) { int i; if(u == sink) return delta; else{ int ret=0; for(i=g[u]; i&δ i=e[i].nxt){ if(e[i].f&&dist[e[i].v]==dist[u]+1){ int dd=dfs(e[i].v,min(e[i].f,delta)); e[i].f-=dd; e[i^1].f+=dd; delta-=dd; ret+=dd; } } return ret; } } int dinic(){ int ret=0; while(true){ memset(vis,0,sizeof(vis)); bfs(); if(!vis[sink]) return ret; ret+=dfs(src,inf); } } int main() { int food[300],drink[300]; int i,j,n,f,d; while(scanf("%d%d%d",&n,&f,&d)!=EOF){ nume=1; memset(g,0,sizeof(g)); for(i=0;i