• Hdu 4280 最大流<模板>.cpp


    题意:

    给了一个T 代表有 T 组数据

    每组数据给出 n 个点和 m 条边

    然后接下来 n 行..x, y 表示每个点的坐标

    然后 m 行..a b w 表示 a 点和 b 点之间有权值 w..

    求最大流..

    思路:

    主要是最大流的方法..

    最大流ISAP,邻接表+GAP+当前弧优化

    Tips:

    理解用法..

    Code:

    View Code
      1 #include <stdio.h>
      2 #include <cstring>
      3 #include <iostream>
      4 using namespace std;
      5 #define clr(x) memset(x, 0xff, sizeof(x))
      6 #define min(a,b)(a)<(b)?(a):(b)
      7 
      8 const int INF = 0x1f1f1f1f;
      9 const int maxn = 100010;
     10 const int maxm = 200010;
     11 struct Edge
     12 {
     13     int from;
     14     int to;
     15     int next;
     16     int w;
     17 }edge[maxm];
     18 int tot;
     19 int head[maxn];
     20 
     21 void add(int s, int u, int w)
     22 {
     23     edge[tot].from = s;
     24     edge[tot].to = u;
     25     edge[tot].w = w;
     26     edge[tot].next = head[s];
     27     head[s] = tot++;
     28     edge[tot].from = u;
     29     edge[tot].to = s;
     30     edge[tot].w = w;
     31     edge[tot].next = head[u];
     32     head[u] = tot++;
     33 }
     34 
     35 int q[maxn];
     36 int cnt[maxn];
     37 int d[maxn];
     38 int low[maxn];
     39 int cur[maxn];
     40 
     41 int maxflow(int s, int t, int n)
     42 {
     43     int *front = q, *rear = q;
     44     for(int i = 1; i <= n; ++i) {
     45         d[i] = n;
     46         cnt[i] = 0;
     47     }
     48     cnt[n] = n-1;
     49     cnt[0]++;
     50     d[t] = 0;
     51     *rear++ = t;
     52     while(front < rear) {
     53         int v = *front++;
     54         for(int i = head[v]; i != -1; i = edge[i].next) {
     55             if(d[edge[i].to] == n && edge[i^1].w > 0) {
     56                 d[edge[i].to] = d[v] + 1;
     57                 cnt[n]--;
     58                 cnt[d[edge[i].to]]++;
     59                 *rear++ = edge[i].to;
     60             }
     61         }
     62     }
     63 
     64     int flow = 0, u = s, top = 0;
     65     low[0] = INF;
     66     for(int i = 1; i <= n; ++i) {
     67         cur[i] = head[i];
     68     }
     69     while(d[s] < n) {
     70         int &i = cur[u];
     71         for(; i != -1; i = edge[i].next) {
     72             if(edge[i].w > 0 && d[u] == d[edge[i].to]+1) {
     73                 low[top+1] = min(low[top], edge[i].w);
     74                 q[++top] = i;
     75                 u = edge[i].to;
     76                 break;
     77             }
     78         }
     79         if(i != -1) {
     80             if(u == t) {
     81                 int minf = low[top];
     82                 for(int p = 1, i; p <= top; ++p) {
     83                     i = q[p];
     84                     edge[i].w -= minf;
     85                     edge[i^1].w += minf;
     86                 }
     87                 flow += minf;
     88                 u = s;
     89                 low[0] = INF;
     90                 top = 0;
     91             }
     92         }
     93         else {
     94             int old_du = d[u];
     95             cnt[old_du]--;
     96             d[u] = n-1;
     97             for(int i = head[u]; i != -1; i = edge[i].next)
     98                 if(edge[i].w > 0 && d[u] > d[edge[i].to]) {
     99                     d[u] = d[edge[i].to];
    100                 }
    101                 cnt[++d[u]]++;
    102                 if(d[u]<n)
    103                     cur[u] = head[u];
    104                 if(u != s) {
    105                     u = edge[q[top]].from;
    106                     --top;
    107                 }
    108                 if(cnt[old_du] == 0) break;
    109         }
    110     }
    111     return flow;
    112 }
    113 
    114 struct Node
    115 {
    116     int x;
    117     int y;
    118 }node[100010];
    119 
    120 int main()
    121 {
    122     int i, j, k;
    123     int T, n, m;
    124     int a, b, c;
    125     int start, end;
    126     while(scanf("%d", &T) != EOF)
    127     while(T--)
    128     {
    129         start = end = 1;
    130         tot = 0;
    131         clr(head);
    132 
    133         scanf("%d %d", &n, &m);
    134         for(i = 1; i <= n; ++i) {
    135             scanf("%d %d", &node[i].x, &node[i].y);
    136             if(node[i].x > node[end].x) {
    137                 end = i;
    138             }
    139             if(node[i].x < node[start].x) {
    140                 start = i;
    141             }
    142         }
    143 
    144         while(m--) {
    145             scanf("%d %d %d", &a, &b, &c);
    146             add(a, b, c);
    147         }
    148 
    149         int ans = maxflow(start, end, n);
    150         printf("%d\n", ans);
    151     }
    152     return 0;
    153 }

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4280

  • 相关阅读:
    chmod命令详细用法
    mysql删除sql表添加别名及删除sql的注意事项
    bootstrap栅格系统进行偏移格式
    mysql中时间计算函数SQL DATE_SUB()用法
    阿里图标的应用教程
    jquery.cookie.js中$.cookie() 使用方法
    $.cookie()取值设置
    java中年月日的加减法,年月的加减法使用
    IMAP命令与分析
    Telnet IMAP Commands Note
  • 原文地址:https://www.cnblogs.com/Griselda/p/2686981.html
Copyright © 2020-2023  润新知