zoukankan      html  css  js  c++  java
  • BZOJ3396 [Usaco2009 Jan]Total flow 水流

    虽然我想说,这貌似是。。。可以直接dfs做的。。。

    但是还是Dinic最大流保险一点。。。

    板子补完中→_→

      1 /**************************************************************
      2     Problem: 3396
      3     User: rausen
      4     Language: C++
      5     Result: Accepted
      6     Time:0 ms
      7     Memory:824 kb
      8 ****************************************************************/
      9  
     10 #include <cstdio>
     11 #include <cctype>
     12 #include <cstring>
     13 #include <algorithm>
     14  
     15 using namespace std;
     16 const int inf = (int) 1e9;
     17 const int N = 65;
     18 const int M = 1505;
     19  
     20 struct edges{
     21     int next, to, f;
     22     edges() {}
     23     edges(int _next, int _to, int _f) : next(_next), to(_to), f(_f) {}
     24 } e[M];
     25  
     26 int n;
     27 int first[N], tot = 1, d[N], q[N];
     28 int S, T;
     29  
     30 inline int read() {
     31     int x = 0;
     32     char ch = getchar();
     33     while (ch < '0' || '9' < ch)
     34         ch = getchar();
     35     while ('0' <= ch && ch <= '9') {
     36         x = x * 10 + ch - '0';
     37         ch = getchar();
     38     }
     39     return x;
     40 }
     41  
     42 inline char getc() {
     43     char ch = getchar();
     44     while (!isalpha(ch))
     45         ch = getchar();
     46     return ch;
     47 }
     48  
     49 inline void add_edge(int x, int y, int z){
     50     e[++tot] = edges(first[x], y, z);
     51     first[x] = tot;
     52 }
     53    
     54 inline void Add_Edges(int x, int y, int z){
     55     add_edge(x, y, z);
     56     add_edge(y, x, 0);
     57 }
     58  
     59 bool bfs(){
     60     memset(d, 0, sizeof(d));
     61     q[1] = S, d[S] = 1;
     62     int l = 0, r = 1, x, y;
     63     while (l < r){
     64         ++l;
     65         for (x = first[q[l]]; x; x = e[x].next){
     66             y = e[x].to;
     67             if (!d[y] && e[x].f)
     68                 q[++r] = y, d[y] = d[q[l]] + 1;
     69         }
     70     }
     71     return d[T];
     72 }
     73    
     74 int dinic(int p, int limit){
     75     if (p == T || !limit) return limit;
     76     int x, y, tmp, rest = limit;
     77     for (x = first[p]; x; x = e[x].next){
     78         y = e[x].to;
     79         if (d[y] == d[p] + 1 && e[x].f && rest){
     80             tmp = dinic(y, min(rest, e[x].f));
     81             rest -= tmp;
     82             e[x].f -= tmp, e[x ^ 1].f += tmp;
     83             if (!rest) return limit;
     84         }
     85     }
     86     if (limit == rest) d[p] = 0;
     87     return limit - rest;
     88 }
     89    
     90 int Dinic(){
     91     int res = 0, x;
     92     while (bfs())
     93         res += dinic(S, inf);
     94     return res;
     95 }
     96  
     97 int main() {
     98     char ch;
     99     int i, x, y, z;
    100     n = read();
    101     for (i = 1; i <= n; ++i) {
    102         ch = getc();
    103         if ('A' <= ch && ch <= 'Z')
    104             x = ch - 'A' + 1;
    105         else x = ch - 'a' + 27;
    106         ch = getc();
    107         if ('A' <= ch && ch <= 'Z')
    108             y = ch - 'A' + 1;
    109         else y = ch - 'a' + 27;
    110         z = read();
    111         Add_Edges(x, y, z);
    112     }
    113     S = 1, T = 26;
    114     printf("%d
    ", Dinic());
    115     return 0;
    116 }
    View Code

    (p.s. 为毛线。。。之前的Dinic写错了还过了?233) 

    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    到底该不该熟悉掌握struts2的ONGL呢?
    struts2 request内幕 为什么在struts2用EL表达式可以取值
    struts2 权限拦截器 拦截没有登陆的请求
    tomcat context 配置 项目部署
    tomcat 设置默认编码格式
    工作记录1
    javascript 的学习笔记(第一天)
    JavaScript for...in 循环
    indexof方法区分大小写
    java 和 IntelliJ IDEA 的一些配置
  • 原文地址:https://www.cnblogs.com/rausen/p/4101920.html
Copyright © 2011-2022 走看看