POJ 1273 Drainage Ditches

来源:互联网 发布:青海广电网络投诉电话 编辑:程序博客网 时间:2024/06/15 07:49

裸最大流,可以用来试一试模板的速度啥的。

#include "cstdio"#include "vector"#include "queue"#include "cstring"using namespace std;struct edge{int to,cap,rev;};#define max_v 222#define inf 11111111vector <edge> g[max_v];int level[max_v];int iter[max_v];void add_edge(int from,int to,int cap){g[from].push_back((edge){to,cap,(int)g[to].size()});g[to].push_back((edge){from,0,(int)g[from].size()-1});}void bfs(int s){memset(level,-1,sizeof(level));queue<int> que;level[s]=0;que.push(s);while(!que.empty()){    int v=que.front(); que.pop();    for(int i=0;i<g[v].size();i++){        edge &e=g[v][i];        if(e.cap>0&&level[e.to]<0){            level[e.to]=level[v]+1;            que.push(e.to);        }    }}}int dfs(int v,int t,int f){if(v==t)  return f;for(int &i=iter[v];i<g[v].size();i++){    edge &e=g[v][i];    if(e.cap>0&&level[v]<level[e.to]){        int d=dfs(e.to,t,min(f,e.cap));        if(d>0){            e.cap-=d;            g[e.to][e.rev].cap+=d;            return d;        }    }}return 0;}int max_flow(int s,int t){int flow=0;for(;;){    bfs(s);    if(level[t]<0)  return flow;    memset(iter,0,sizeof(iter));    int f;    while((f=dfs(s,t,inf))>0){ flow+=f;}}}int main(){    int n,m;    int s,e,c;    while(scanf("%d%d",&n,&m)!=EOF){        memset(g,0,sizeof(g));        for(int i=0;i<n;i++){            scanf("%d%d%d",&s,&e,&c);            add_edge(s,e,c);        }        printf("%d\n",max_flow(1,m));    }    return 0;}


0 0
原创粉丝点击