zoukankan      html  css  js  c++  java
  • hdu 4289 Control 网络流

    题目链接

    给出一些点, 每个点有一个权值, 给出一些边, 起点以及终点, 去掉一些点使得起点和终点不连通, 求最小的val。

    拆点, 把一个点s拆成s和s', 之间建一条边, 权值为点权。 对于一条边, <u, v> 建边<u, v'>, <v, u'> 权值为inf, 跑一遍最大流。

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 #define pb(x) push_back(x)
      4 #define ll long long
      5 #define mk(x, y) make_pair(x, y)
      6 #define lson l, m, rt<<1
      7 #define mem(a) memset(a, 0, sizeof(a))
      8 #define rson m+1, r, rt<<1|1
      9 #define mem1(a) memset(a, -1, sizeof(a))
     10 #define mem2(a) memset(a, 0x3f, sizeof(a))
     11 #define rep(i, a, n) for(int i = a; i<n; i++)
     12 #define ull unsigned long long
     13 typedef pair<int, int> pll;
     14 const double PI = acos(-1.0);
     15 const double eps = 1e-8;
     16 const int mod = 1e9+7;
     17 const int inf = 1061109567;
     18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
     19 const int maxx = 405;
     20 const int maxn = 40005;
     21 int head[maxn*4], s, t, num, q[maxn*3], dis[maxn];
     22 struct node
     23 {
     24     int to, nextt, c;
     25 }e[maxn*4];
     26 void init() {
     27     mem1(head);
     28     num = 0;
     29 }
     30 void add(int u, int v, int c) {
     31     e[num].to = v; e[num].nextt = head[u]; e[num].c = c; head[u] = num++;
     32     e[num].to = u; e[num].nextt = head[v]; e[num].c = 0; head[v] = num++;
     33 }
     34 int bfs() {
     35     int u, v, st = 0, ed = 0;
     36     mem(dis);
     37     dis[s] = 1;
     38     q[ed++] = s;
     39     while(st<ed) {
     40         u = q[st++];
     41         for(int i = head[u]; ~i; i = e[i].nextt) {
     42             v = e[i].to;
     43             if(e[i].c&&!dis[v]) {
     44                 dis[v] = dis[u]+1;
     45                 if(v == t)
     46                     return 1;
     47                 q[ed++] = v;
     48             }
     49         }
     50     }
     51     return 0;
     52 }
     53 int dfs(int u, int limit) {
     54     if(u == t)
     55         return limit;
     56     int cost = 0;
     57     for(int i = head[u]; ~i; i = e[i].nextt) {
     58         int v = e[i].to;
     59         if(e[i].c&&dis[u] == dis[v]-1) {
     60             int tmp = dfs(v, min(limit-cost, e[i].c));
     61             if(tmp>0) {
     62                 e[i].c -= tmp;
     63                 e[i^1].c += tmp;
     64                 cost += tmp;
     65                 if(cost == limit)
     66                     break;
     67             } else {
     68                 dis[v] = -1;
     69             }
     70         }
     71     }
     72     return cost;
     73 }
     74 int dinic() {
     75     int ans = 0;
     76     while(bfs()) {
     77         ans += dfs(s, inf);
     78     }
     79     return ans;
     80 }
     81 int main()
     82 {
     83     int n, m, val, x, y;
     84     while(cin>>n>>m) {
     85         cin>>s>>t;
     86         t+=n;
     87         init();
     88         for(int i = 1; i<=n; i++) {
     89             scanf("%d", &val);
     90             add(i, i+n, val);
     91         }
     92         while(m--) {
     93             scanf("%d%d", &x, &y);
     94             add(x+n, y, inf);
     95             add(y+n, x, inf);
     96         }
     97         int ans = dinic();
     98         cout<<ans<<endl;
     99     }
    100 }
  • 相关阅读:
    join
    Hadoop 的 TotalOrderPartitioner
    机器学习开源项目
    java 编程性能调优
    kettel的stream lookup报错
    Mondrian Schema workbench工作界面 简介(实在懒得写,居然有人弄了,收藏了)
    linux软链接和硬链接
    那些超级成功的公司(看着不错,自己收藏)
    Ngnix中的fastcgi參数性能优化和解释
    zip 的 压缩与解压
  • 原文地址:https://www.cnblogs.com/yohaha/p/5018005.html
Copyright © 2011-2022 走看看