zoukankan      html  css  js  c++  java
  • hdu 3061 最大权闭合子图

    属于模板题吧。。。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <vector>
     4 #define min(a,b) ((a)<(b)?(a):(b))
     5 #define oo 0x3f3f3f3f
     6 #define N 610
     7 using namespace std;
     8 
     9 struct Edge {
    10     int u, v, f;
    11     Edge( int u, int v, int f ):u(u),v(v),f(f){}
    12 };
    13 struct Dinic {
    14     int src, dst;
    15     vector<Edge> edge;
    16     vector<int> g[N];
    17     int dep[N], cur[N], qu[N], bg, ed;
    18 
    19     void init( int n, int src, int dst ) {
    20         this->src = src;
    21         this->dst = dst;
    22         for( int i=1; i<=n; i++ )
    23             g[i].clear();
    24         edge.clear();
    25     }
    26     void adde( int u, int v, int f ) {
    27         g[u].push_back( edge.size() );
    28         edge.push_back( Edge(u,v,f) );
    29         g[v].push_back( edge.size() );
    30         edge.push_back( Edge(v,u,0) );
    31     }
    32     bool bfs() {
    33         memset( dep, 0, sizeof(dep) );
    34         qu[bg=ed=1] = src;
    35         dep[src] = 1;
    36         while( bg<=ed ) {
    37             int u=qu[bg++];
    38             for( int t=0; t<g[u].size(); t++ ) {
    39                 Edge &e = edge[g[u][t]];
    40                 if( e.f && !dep[e.v] ) {
    41                     dep[e.v] = dep[e.u]+1;
    42                     qu[++ed] = e.v;
    43                 }
    44             }
    45         }
    46         return dep[dst];
    47     }
    48     int dfs( int u, int a ) {
    49         if( u==dst || a==0 ) return a;
    50         int remain=a, past=0, na;
    51         for( int &t=cur[u]; t<g[u].size(); t++ ) {
    52             Edge &e = edge[g[u][t]];
    53             Edge &ve = edge[g[u][t]^1];
    54             if( e.f && dep[e.v]==dep[e.u]+1 && (na=dfs(e.v,min(remain,e.f))) ) {
    55                 remain -= na;
    56                 past += na;
    57                 e.f -= na;
    58                 ve.f += na;
    59                 if( !remain ) break;
    60             }
    61         }
    62         return past;
    63     }
    64     int maxflow() {
    65         int flow = 0;
    66         while( bfs() ) {
    67             memset( cur, 0, sizeof(cur) );
    68             flow += dfs(src,oo);
    69         }
    70         return flow;
    71     }
    72 }D;
    73 
    74 int n, m;
    75 int src, dst;
    76 int wght[N], sum;
    77 
    78 int main() {
    79     while( scanf("%d%d",&n,&m)==2 ) {
    80         src = n+1, dst = n+2;
    81         D.init( n+2, src, dst );
    82         sum = 0;
    83         for( int i=1; i<=n; i++ ) {
    84             scanf( "%d", wght+i );
    85             if( wght[i]>0 ) 
    86                 D.adde( src, i, wght[i] ), sum += wght[i];
    87             if( wght[i]<0 )
    88                 D.adde( i, dst, -wght[i] );
    89         }
    90         for( int i=1,u,v; i<=m; i++ ) {
    91             scanf( "%d%d", &u, &v );
    92             D.adde( u, v, oo );
    93         }
    94         printf( "%d
    ", sum - D.maxflow() );
    95     }
    96 }
    View Code
  • 相关阅读:
    SpringMVC 拦截器实现权限统一校验
    SpringMVC 全局异常处理
    Maven环境隔离应用场景
    Lombok入门
    父组件动态生成,子组件值进行渲染
    java实战
    Android studio 如何通过DB Navigator连接微软的SQL Server
    自定义的AutoComplTextView
    转 -- 用shape画内圆外方,形成一个圆形头像
    (记录问题)1.Canvas.drawArc()方法的问题
  • 原文地址:https://www.cnblogs.com/idy002/p/4530638.html
Copyright © 2011-2022 走看看