zoukankan      html  css  js  c++  java
  • bzoj 3931 最短路+最大流

    较水,但因为范围问题WA了两次。。。。

      1 /**************************************************************
      2     Problem: 3931
      3     User: idy002
      4     Language: C++
      5     Result: Accepted
      6     Time:392 ms
      7     Memory:3224 kb
      8 ****************************************************************/
      9  
     10 #include <cstdio>
     11 #include <cstring>
     12 #include <vector>
     13 #include <queue>
     14 #define min(a,b) ((a)<(b)?(a):(b))
     15 #define N 1100
     16 #define M 200010
     17 #define oo 0x3f3f3f3f
     18 using namespace std;
     19  
     20 typedef long long dnt;
     21 struct Pair {
     22     int u;
     23     dnt d;
     24     Pair( int u, dnt d ):u(u),d(d){}
     25     bool operator<( const Pair &p ) const { return d>p.d; }
     26 };
     27 struct Edge {
     28     int u, v, f;
     29     Edge( int u, int v, int f ):u(u),v(v),f(f){}
     30 };
     31 struct Dinic {
     32     int src, dst;
     33     vector<Edge> edge;
     34     vector<int> g[N];
     35     int dep[N], cur[N], qu[N], bg, ed;
     36     void init( int src, int dst ) {
     37         this->src = src;
     38         this->dst = dst;
     39     }
     40     void adde( int u, int v, int f ) {
     41         g[u].push_back( edge.size() );
     42         edge.push_back( Edge(u,v,f) );
     43         g[v].push_back( edge.size() );
     44         edge.push_back( Edge(v,u,0) );
     45     }
     46     bool bfs() {
     47         memset( dep, 0, sizeof(dep) );
     48         qu[bg=ed=1] = src;
     49         dep[src] = 1;
     50         while( bg<=ed ) {
     51             int u=qu[bg++];
     52             for( int t=0; t<g[u].size(); t++ )  {
     53                 Edge &e = edge[g[u][t]];
     54                 if( e.f && !dep[e.v] ) {
     55                     dep[e.v] = dep[e.u]+1;
     56                     qu[++ed] = e.v;
     57                 }
     58             }
     59         }
     60         return dep[dst];
     61     }
     62     dnt dfs( int u, dnt a ) {
     63         if( u==dst || a==0 ) return a;
     64         dnt remain=a, past=0, na;
     65         for( int &t=cur[u]; t<g[u].size(); t++ ) {
     66             Edge &e = edge[g[u][t]];
     67             Edge &ve = edge[g[u][t]^1];
     68             if( e.f && dep[e.v]==dep[e.u]+1 && (na=dfs(e.v,min(remain,e.f))) ) {
     69                 remain -= na;
     70                 past += na;
     71                 e.f -= na;
     72                 ve.f += na;
     73                 if( !remain ) break;
     74             }
     75         }
     76         return past;
     77     }
     78     dnt maxflow() {
     79         dnt rt = 0;
     80         while( bfs() ) {
     81             memset( cur, 0, sizeof(cur) );
     82             rt += dfs(src,0x3f3f3f3f3f3f3f3fll);
     83         }
     84         return rt;
     85     }
     86 }D;
     87  
     88 int n, m;
     89 int head[N], cc[N], dest[M], wght[M], next[M], etot;
     90 dnt dis[2][N];
     91 int in[N], out[N], src, dst, idc;
     92  
     93 void adde( int u, int v, int w ) {
     94     etot++;
     95     dest[etot] = v;
     96     wght[etot] = w;
     97     next[etot] = head[u];
     98     head[u] = etot;
     99 }
    100 void dijstra( int src, dnt dis[] ) {
    101     static bool done[N];
    102     memset( done, false, sizeof(done) );
    103     priority_queue<Pair> q;
    104     q.push( Pair(src,0) );
    105     dis[src] = 0;
    106     while( !q.empty() ) {
    107         Pair p = q.top();
    108         q.pop();
    109         int u=p.u;
    110         if( done[u] ) continue;
    111         done[u] = true;
    112         for( int t=head[u]; t; t=next[t] ) {
    113             int v=dest[t], w=wght[t];
    114             if( dis[v]>dis[u]+w ) {
    115                 dis[v]=dis[u]+w;
    116                 q.push( Pair(v,dis[v]) );
    117             }
    118         }
    119     }
    120 }
    121 void makeid() {
    122     idc = 0;
    123     for( int i=1; i<=n; i++ ) {
    124         in[i] = ++idc;
    125         out[i] = ++idc;
    126     }
    127     src = out[1];
    128     dst = in[n];
    129 }
    130 void build() {
    131     memset( dis, 0x3f, sizeof(dis) );
    132     dijstra( 1, dis[0] );
    133     dijstra( n, dis[1] );
    134     makeid();
    135     D.init( src, dst );
    136     for( int i=1; i<=n; i++ ) 
    137         if( dis[0][n]==dis[0][i]+dis[1][i] ) 
    138             D.adde( in[i], out[i], cc[i] );
    139     for( int u=1; u<=n; u++ )
    140         for( int t=head[u]; t; t=next[t] ) {
    141             int v=dest[t], w=wght[t];
    142             if( dis[0][u]+dis[1][v]+w==dis[0][n] )
    143                 D.adde( out[u], in[v], oo );
    144         }
    145 }
    146 int main() {
    147     scanf( "%d%d", &n, &m );
    148     for( int i=1,u,v,w; i<=m; i++ ) {
    149         scanf( "%d%d%d", &u, &v, &w );
    150         adde( u, v, w );
    151         adde( v, u, w );
    152     }
    153     for( int i=1; i<=n; i++ )
    154         scanf( "%d", cc+i );
    155     build();
    156     printf( "%lld
    ", D.maxflow() );
    157 }
    158 
    View Code
  • 相关阅读:
    搭上末班车去了京东,终于可以做东哥兄弟...
    面试官问我会不会Elasticsearch,我语塞了...
    Elasticsearch到底哪点好?
    资本寒冬,应届生被裁,亲身经历从被裁到上岸,我们该如何自渡?如何保持核心竞争力?
    面试官求你了,别再问我TCP的三次握手和四次挥手
    如何保证网络传输的可靠性?
    龙叔拿了20几个offer,原因竟有些泪目...
    面试百度的机器学习算法,也不过如此
    《数据结构与算法》—— O(3N)=O(N) ?
    我以为我学懂了数据结构,看到这张导图,我才发现我错了
  • 原文地址:https://www.cnblogs.com/idy002/p/4525737.html
Copyright © 2011-2022 走看看