• hdu 4280 最大流sap


    模板套起来

    1  
    5 7  //5个结点,7个边
    3 3  //坐标
    3 0  
    3 1
    0 0
    4 5
    1 3 3  //相连的结点和流
    2 3 4
    2 4 3
    1 5 6
    4 5 3
    1 4 4
    3 4 2

    9
      1 #include<cstdio>
      2 #include<algorithm>
      3 #include<cstring>
      4 using namespace std;
      5 const int MAXN = 100010;//点数的最大值
      6 const int MAXM = 400010;//边数的最大值
      7 const int INF = 0x3f3f3f3f;
      8 int n;
      9 struct Edge
     10 {
     11     int to,next,cap,flow;
     12 }edge[MAXM];//注意是MAXM
     13 int tol;
     14 int head[MAXN];
     15 int gap[MAXN],dep[MAXN],cur[MAXN];
     16 void init()
     17 {
     18     tol = 0;
     19     memset(head,-1,sizeof(head));
     20 }
     21 void addedge(int u,int v,int w,int rw = 0)
     22 {
     23     edge[tol].to = v; edge[tol].cap = w; edge[tol].flow = 0;
     24     edge[tol].next = head[u]; head[u] = tol++;
     25     edge[tol].to = u; edge[tol].cap = rw; edge[tol].flow = 0;
     26     edge[tol].next = head[v]; head[v] = tol++;
     27 }
     28 int Q[MAXN];
     29 void BFS(int start,int end)
     30 {
     31     memset(dep,-1,sizeof(dep));
     32     memset(gap,0,sizeof(gap));
     33     gap[0] = 1;
     34     int front = 0, rear = 0;
     35     dep[end] = 0;
     36     Q[rear++] = end;
     37     while(front != rear)
     38     {
     39         int u = Q[front++];
     40         for(int i = head[u]; i != -1; i = edge[i].next)
     41         {
     42             int v = edge[i].to;
     43             if(dep[v] != -1)continue;
     44             Q[rear++] = v;
     45             dep[v] = dep[u] + 1;
     46             gap[dep[v]]++;
     47         }
     48     }
     49 }
     50 int S[MAXN];
     51 int SAP(int start,int end,int N)
     52 {
     53     BFS(start,end);
     54     memcpy(cur,head,sizeof(head));
     55     int top = 0;
     56     int u = start;
     57     int ans = 0;
     58     while(dep[start] < N)
     59     {
     60         if(u == end)
     61         {
     62             int Min = INF;
     63             int inser;
     64             for(int i = 0;i < top;i++)
     65             if(Min > edge[S[i]].cap - edge[S[i]].flow)
     66             {
     67                 Min = edge[S[i]].cap - edge[S[i]].flow;
     68                 inser = i;
     69             }
     70             for(int i = 0;i < top;i++)
     71             {
     72                 edge[S[i]].flow += Min;
     73                 edge[S[i]^1].flow -= Min;
     74             }
     75             ans += Min;
     76             top = inser;
     77             u = edge[S[top]^1].to;
     78             continue;
     79         }
     80         bool flag = false;
     81         int v;
     82         for(int i = cur[u]; i != -1; i = edge[i].next)
     83         {
     84             v = edge[i].to;
     85             if(edge[i].cap - edge[i].flow && dep[v]+1 == dep[u])
     86             {
     87                 flag = true;
     88                 cur[u] = i;
     89                 break;
     90             }
     91         }
     92         if(flag)
     93         {
     94             S[top++] = cur[u];
     95             u = v;
     96             continue;
     97         }
     98         int Min = N;
     99         for(int i = head[u]; i != -1; i = edge[i].next)
    100         if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min)
    101         {
    102             Min = dep[edge[i].to];
    103             cur[u] = i;
    104         }
    105         gap[dep[u]]--;
    106         if(!gap[dep[u]])return ans;
    107         dep[u] = Min + 1;
    108         gap[dep[u]]++;
    109         if(u != start)u = edge[S[--top]^1].to;
    110         }
    111     return ans;
    112 }
    113 int main()
    114 {
    115     #ifndef ONLINE_JUDGE
    116     freopen("1.in","r",stdin);
    117     #endif
    118     int start,end;
    119     int m;
    120     int u,v,z;
    121     int T;
    122     scanf("%d",&T);
    123     while(T--)
    124     {
    125         init();
    126         scanf("%d%d",&n,&m);
    127         int minx=10000000;
    128         int maxx=-10000000;
    129         int x,y;
    130         for(int i=1;i<=n;i++)
    131         {
    132             scanf("%d%d",&x,&y);
    133             if(minx>x)
    134             {
    135                 minx=x;
    136                 start=i;
    137             }
    138             if(maxx<x)
    139             {
    140                 maxx=x;
    141                 end=i;
    142             }
    143         }
    144         while(m--)
    145         {
    146             scanf("%d%d%d",&u,&v,&z);
    147             addedge(u,v,z);
    148             addedge(v,u,z);
    149         }
    150         int ans=SAP(start,end,n);
    151         printf("%d
    ",ans);
    152     }
    153     return 0;
    154 }
  • 相关阅读:
    (二)服务器性能剖析
    (一) MySQL架构
    HBase学习笔记一
    Hadoop系列读书笔记
    Java基础小结
    Redis学习笔记一
    Hive学习笔记一
    使用redis-benchmark测试redis性能
    关闭Stackexchange.Redis的未用到的pub/sub连接
    redis报错:EXCEPTION_ACCESS_VIOLATION
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4348661.html
Copyright © 2020-2023  润新知