Advertisement
Guest User

Untitled

a guest
Aug 30th, 2014
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pb push_back
  3. #define N 15
  4. #define ll long long
  5. using namespace std;
  6.  
  7. int A[ N+5 ];
  8. map< string , int> M;
  9. vector<int>adj[ N+5 ];
  10. string s,cad;
  11. int n , m ,edges, caso=1;
  12. ll maxi ;
  13.  
  14. struct flow_graph{
  15.     int MAX_V,E,s,t,head,tail;
  16.     int *cap,*to,*next,*last,*dist,*q,*now;
  17.      
  18.     flow_graph(){}
  19.      
  20.     flow_graph(int V, int MAX_E){
  21.         MAX_V = V; E = 0;
  22.         cap = new int[2*MAX_E], to = new int[2*MAX_E], next = new int[2*MAX_E];
  23.         last = new int[MAX_V], q = new int[MAX_V];
  24.         dist = new int[MAX_V], now = new int[MAX_V];
  25.         fill(last,last+MAX_V,-1);
  26.     }
  27.      
  28.     void clear(){
  29.         fill(last,last+MAX_V,-1);
  30.         E = 0;
  31.     }
  32.      
  33.     void add_edge(int u, int v, int uv){
  34.         to[E] = v, cap[E] = uv, next[E] = last[u]; last[u] = E++;
  35.         to[E] = u, cap[E] = 0, next[E] = last[v]; last[v] = E++;
  36.     }
  37.    
  38.     bool bfs(){
  39.         fill(dist,dist+MAX_V,-1);
  40.         head = tail = 0;
  41.      
  42.         q[tail] = t; ++tail;
  43.         dist[t] = 0;
  44.      
  45.         while(head<tail){
  46.             int v = q[head]; ++head;
  47.              
  48.             for(int e = last[v];e!=-1;e = next[e]){
  49.                 if(cap[e^1]>0 && dist[to[e]]==-1){
  50.                     q[tail] = to[e]; ++tail;
  51.                     dist[to[e]] = dist[v]+1;
  52.                 }
  53.             }
  54.         }
  55.          
  56.         return dist[s]!=-1;
  57.     }
  58.    
  59.     int dfs(int v, int f){
  60.         if(v==t) return f;
  61.      
  62.         for(int &e = now[v];e!=-1;e = next[e]){
  63.             if(cap[e]>0 && dist[to[e]]==dist[v]-1){
  64.                 int ret = dfs(to[e],min(f,cap[e]));
  65.          
  66.                 if(ret>0){
  67.                     cap[e] -= ret;
  68.                     cap[e^1] += ret;
  69.                     return ret;
  70.                 }
  71.             }
  72.         }
  73.      
  74.         return 0;
  75.     }
  76.    
  77.     long long max_flow(int source, int sink){
  78.         s = source; t = sink;
  79.         long long f = 0,df;
  80.      
  81.         while(bfs()){
  82.             for(int i = 0;i<MAX_V;++i) now[i] = last[i];
  83.        
  84.             while(true){
  85.                 df = dfs(s,INT_MAX);
  86.                 if(df==0) break;
  87.                 f += df;
  88.             }
  89.         }
  90.      
  91.         return f;
  92.     }
  93. }G;
  94.  
  95. void calc( ){
  96. int S =n+m , T = n+m+1;
  97. for( int mask=1 ; mask<( 1<<n ) ; ++mask ){
  98. int bits = __builtin_popcount( mask );
  99. if( bits < maxi ) continue;
  100. int need=0;
  101. for( int i =0  ;i<n ; ++i ){
  102. if( ! ( mask & ( 1<<i ) ) ) continue;
  103. else need+=A[ i ];
  104. }
  105. G = flow_graph( n+m+5 , edges + n + m +5 );
  106. for( int i =0 ; i<n ; ++i ){
  107. if( ! ( mask & ( 1<<i ) ) ) continue;
  108. int sz = adj[ i ].size( );
  109. for( int j =0 ; j<sz ; ++j ){
  110. int v = adj[ i ][ j ];
  111. G.add_edge( v , i , 1 );
  112. }
  113. }
  114. for( int i=0 ; i<m ; ++i ){
  115. G.add_edge( S , i , 1 );
  116. }
  117. for( int i=0 ; i<n ; ++i ){
  118. G.add_edge( i+m , T , A[ i ] );
  119. }
  120. ll res = G.max_flow( S, T );
  121. if( res == need ){
  122. maxi = max( maxi, res );
  123. }
  124. }
  125. }
  126.  
  127. bool doit(){
  128. scanf("%d%d",&n ,&m );
  129. if( !n && !m )return 0;
  130. edges = 0;
  131. for( int i=0 ; i<n ; ++i ){
  132. cin>>s>>A[ i ];
  133. M[ s ] = i+m; // contests
  134. }
  135. getline( cin , cad );
  136. for( int i =0 ; i<m ; ++i ){
  137. getline( cin , cad );
  138. istringstream in( cad );
  139. while( in >>s ){
  140. adj[ i ].pb( M[ cad ] );
  141. edges++;
  142. }
  143. }
  144. maxi = 0;
  145. calc( );
  146. printf("Case #%d: %lld\n", caso++ , maxi );
  147. return 1;
  148. }
  149.  
  150. int main( ){
  151. while( doit());
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement