zoukankan      html  css  js  c++  java
  • [HDOJ5889]Barricade(spfa,最大流)

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

    求出所有最短路,标记好以后跑最大流就是最小割。

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 #define fr first
      4 #define sc second
      5 #define cl clear
      6 #define BUG puts("here!!!")
      7 #define W(a) while(a--)
      8 #define pb(a) push_back(a)
      9 #define Rint(a) scanf("%d", &a)
     10 #define Rll(a) scanf("%lld", &a)
     11 #define Rs(a) scanf("%s", a)
     12 #define Cin(a) cin >> a
     13 #define FRead() freopen("in", "r", stdin)
     14 #define FWrite() freopen("out", "w", stdout)
     15 #define Rep(i, len) for(int i = 0; i < (len); i++)
     16 #define For(i, a, len) for(int i = (a); i < (len); i++)
     17 #define Cls(a) memset((a), 0, sizeof(a))
     18 #define Clr(a, x) memset((a), (x), sizeof(a))
     19 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
     20 #define lrt rt << 1
     21 #define rrt rt << 1 | 1
     22 #define pi 3.14159265359
     23 #define RT return
     24 #define lowbit(x) x & (-x)
     25 #define onenum(x) __builtin_popcount(x)
     26 typedef long long LL;
     27 typedef long double LD;
     28 typedef unsigned long long ULL;
     29 typedef pair<int, int> pii;
     30 typedef pair<string, int> psi;
     31 typedef pair<LL, LL> pll;
     32 typedef map<string, int> msi;
     33 typedef vector<int> vi;
     34 typedef vector<LL> vl;
     35 typedef vector<vl> vvl;
     36 typedef vector<bool> vb;
     37 
     38 const int maxn = 1100;
     39 const int maxm = 11000;
     40 const int inf = 1000000000;
     41 typedef struct Edge {
     42   int u, v, w;
     43   int next;
     44   Edge() { next = -1; }
     45 }Edge;
     46 
     47 int n, m, s, t;
     48 Edge edge[maxm];
     49 int head[maxn], ecnt;
     50 int d[maxn];
     51 bool vis[maxn];
     52 int u, v, w;
     53 
     54 int cnt, dhead[maxn];
     55 int cur[maxn], dd[maxn];
     56 Edge dedge[maxm];
     57 int S, T, N;
     58 
     59 void adde(int u, int v, int w) {
     60   edge[ecnt].u = u; edge[ecnt].v = v; edge[ecnt].w = w;
     61   edge[ecnt].next = head[u]; head[u] = ecnt++;
     62 }
     63 
     64 void init() {
     65   Clr(head, -1); ecnt = 0; Cls(vis);
     66   Cls(edge);
     67   Clr(dhead, -1); Cls(dedge);
     68     cnt = 0;
     69 }
     70 
     71 void spfa(int s) {
     72   queue<int> q;
     73   Rep(i, n+1) d[i] = inf;
     74   d[s] = 0; q.push(s);
     75   vis[s] = 1;
     76   while(!q.empty()) {
     77     int u = q.front(); q.pop(); vis[u] = 0;
     78     for(int i = head[u]; ~i; i=edge[i].next) {
     79       int v = edge[i].v;
     80       if(d[v] > d[u] + 1) {
     81         d[v] = d[u] + 1;
     82         if(!vis[v]) {
     83           vis[v] = 1;
     84           q.push(v);
     85         }
     86       }
     87     }
     88   }
     89 }
     90 
     91 void dadde(int u, int v, int w, int c1) {
     92     dedge[cnt].u = u; dedge[cnt].v = v; dedge[cnt].w = w;
     93     dedge[cnt].next = dhead[u]; dhead[u] = cnt++;
     94     dedge[cnt].u = v; dedge[cnt].v = u; dedge[cnt].w = c1;
     95     dedge[cnt].next = dhead[v]; dhead[v] = cnt++;
     96 }
     97 
     98 bool bfs(int s, int t, int n) {
     99     queue<int> q;
    100     for(int i = 0; i < n; i++) dd[i] = inf;
    101     dd[s] = 0;
    102     q.push(s);
    103     while(!q.empty()) {
    104         int u = q.front(); q.pop();
    105         for(int i = dhead[u]; ~i; i = dedge[i].next) {
    106             if(dd[dedge[i].v] > dd[u] + 1 && dedge[i].w > 0) {
    107                 dd[dedge[i].v] = dd[u] + 1;
    108                 if(dedge[i].v == t) return 1;
    109                 q.push(dedge[i].v);
    110             }
    111         }
    112     }
    113     return 0;
    114 }
    115 
    116 int dinic(int s, int t, int n) {
    117     int st[maxn], top;
    118     int u;
    119     int flow = 0;
    120     while(bfs(s, t, n)) {
    121         for(int i = 0; i < n; i++) cur[i] = dhead[i];
    122         u = s; top = 0;
    123         while(cur[s] != -1) {
    124             if(u == t) {
    125                 int tp = inf;
    126                 for(int i = top - 1; i >= 0; i--) {
    127                     tp = min(tp, dedge[st[i]].w);
    128                 }
    129                 flow += tp;
    130                 for(int i = top - 1; i >= 0; i--) {
    131                     dedge[st[i]].w -= tp;
    132                     dedge[st[i] ^ 1].w += tp;
    133                     if(dedge[st[i]].w == 0) top = i;
    134                 }
    135                 u = dedge[st[top]].u;
    136             }
    137             else if(cur[u] != -1 && dedge[cur[u]].w > 0 && dd[u] + 1 == dd[dedge[cur[u]].v]) {
    138                 st[top++] = cur[u];
    139                 u = dedge[cur[u]].v;
    140             }
    141             else {
    142                 while(u != s && cur[u] == -1) {
    143                     u = dedge[st[--top]].u;
    144                 }
    145                 cur[u] = dedge[cur[u]].next;
    146             }
    147         }
    148     }
    149     return flow;
    150 }
    151 
    152 signed main() {
    153   //FRead();
    154   int ttt;
    155   Rint(ttt);
    156   W(ttt) {
    157     init();
    158     Rint(n); Rint(m);
    159     Rep(i, m) {
    160       Rint(u); Rint(v); Rint(w);
    161       adde(u,v,w); adde(v,u,w);
    162     }
    163     spfa(1);
    164     Rep(i, ecmt) {
    165       if(d[edge[i].v] == d[edge[i].u] + 1) {
    166         dadde(edge[i].u-1, edge[i].v-1, edge[i].w, 0);
    167       }
    168     }
    169     S = 0; T = n - 1; N = n;
    170     printf("%d
    ", dinic(S, T, N));
    171   }
    172   RT 0;
    173 }
  • 相关阅读:
    oracle授权另外一个用户访问自己创建的数据对象
    popupWindow使用详解
    oracle用户管理实例
    oracle用户管理入门
    sqlite数据库修改及升级
    android之listView定位到指定行同时隐藏输入键盘
    oracle数据库常用命令
    Oracle11g安装完成后给用户解锁
    Git学习笔记(一)
    gson使用详解
  • 原文地址:https://www.cnblogs.com/kirai/p/5885662.html
Copyright © 2011-2022 走看看