HDU4289 Control 【网络流】

来源:互联网 发布:javascript pdf教程 编辑:程序博客网 时间:2024/06/13 23:48

题意:n个点,m条边,去除某些点使s、d不连通,每个点有权值


思路:最小割等于最大流。n个点拆点,入点到出点,边权为点权;m条双向边,出点连入点,边权为inf


#include<stdio.h>#include<iostream>#include<string.h>#include<string>#include<stdlib.h>#include<math.h>#include<vector>#include<list>#include<map>#include<set>#include<stack>#include<queue>#include<algorithm>#include<numeric>#include<functional>using namespace std;typedef long long ll;typedef pair<int,int> pii;const int maxn = 505;struct edge {int to,cf,rev;};vector<edge> G[maxn];int lev[maxn],iter[maxn];void init(int x){for(int i = 0; i <= x; i++)G[i].clear();}void add(int from, int to, int cap){G[from].push_back((edge){to,cap,G[to].size()});G[to].push_back((edge){from,0,G[from].size()-1});}void bfs(int s){memset(lev,-1,sizeof lev);queue<int> q;lev[s] = 0;q.push(s);while(!q.empty()){int v = q.front();q.pop();for(int i = 0; i < G[v].size(); i++){edge &e = G[v][i];if(e.cf > 0 && lev[e.to] < 0){lev[e.to] = lev[v] + 1;q.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.cf > 0 && lev[v] < lev[e.to]){int d = dfs(e.to, t, min(f,e.cf));if(d > 0){e.cf -= d;G[e.to][e.rev].cf += d;return d;}}}return 0;}int maxflow(int s,int t){int flow = 0;while(1){bfs(s);if(lev[t] < 0) return flow;memset(iter,0,sizeof iter);int f;while((f = dfs(s,t,0x3f3f3f3f)) > 0)flow += f;}}int main(void){int n,m,s,d;while(scanf("%d%d",&n,&m)!=EOF){scanf("%d%d",&s,&d);init(2*n);for(int i = 1; i <= n; i++){int k;scanf("%d",&k);add(2*i-1,2*i,k);}for(int i = 0; i < m; i++){int a,b;scanf("%d%d",&a,&b);add(2*b,2*a-1,0x3f3f3f3f);add(2*a,2*b-1,0x3f3f3f3f);}printf("%d\n",maxflow(2*s-1,2*d));}return 0;}


原创粉丝点击