• POJ1149 PIGS 解题报告


     网络流刷的第一题,从早上8:00的通识课开始想这题。最终在晚上才AC了……网络流好难

      1 /*
      2 Run ID    User    Problem    Result    Memory    Time    Language    Code Length    Submit Time
      3 13647887    yaodongen    1149    Accepted    260K    0MS    C++    3034B    2014-11-20 23:45:03
      4 */
      5 #include <iostream>
      6 #include <sstream>
      7 #include <ios>
      8 #include <iomanip>
      9 #include <functional>
     10 #include <algorithm>
     11 #include <vector>
     12 #include <string>
     13 #include <list>
     14 #include <queue>
     15 #include <deque>
     16 #include <stack>
     17 #include <set>
     18 #include <map>
     19 #include <cstdio>
     20 #include <cstdlib>
     21 #include <cmath>
     22 #include <cstring>
     23 #include <climits>
     24 #include <cctype>
     25 #define INF 0x3f3f3f3f
     26 #define MP(X,Y) make_pair(X,Y)
     27 #define PB(X) push_back(X)
     28 #define REP(X,N) for(int X=0;X<N;X++)
     29 #define REP2(X,L,R) for(int X=L;X<=R;X++)
     30 #define DEP(X,R,L) for(int X=R;X>=L;X--)
     31 #define CLR(A,X) memset(A,X,sizeof(A))
     32 #define IT iterator
     33 #define PI 3.14159265358979323846
     34 #define _ ios_base::sync_with_stdio(0);cin.tie(0);
     35 #define X first
     36 #define Y second
     37 #define MAX_V 10101
     38 #define maxn 110
     39 using namespace std;
     40 typedef long long ll;
     41 typedef pair<int,int>PII;
     42 
     43 struct edge{
     44     int to,cap,rev;
     45     edge(int a,int b,int c):to(a),cap(b),rev(c){}
     46 };
     47 vector<edge> G[maxn];
     48 int level[maxn];
     49 int iter[maxn];
     50 
     51 void add_edge(int from ,int to,int cap){
     52     G[from].PB(edge(to,cap,G[to].size()));
     53     G[to].PB(edge(from,0,G[from].size()-1));
     54 }
     55 void bfs(int s){
     56     memset(level,-1,sizeof(level));
     57     level[s]=0;
     58     queue<int >que;
     59     que.push(s);
     60     while(!que.empty()){
     61         int u=que.front();que.pop();
     62         for(int i=0;i<G[u].size();++i){
     63             edge &e=G[u][i];
     64             if(e.cap>0 && level[e.to]<0){
     65                 level[e.to]=level[u]+1;
     66                 que.push(e.to);
     67             }
     68         }
     69     }
     70 }
     71 int dfs(int v,int t,int f){
     72     if(v==t) return f;
     73     for(int &i=iter[v];i<G[v].size();++i){
     74         edge &e=G[v][i];
     75         if(e.cap>0 && level[e.to]>level[v]){
     76             int d=dfs(e.to,t,min(f,e.cap));        
     77             if(d>0){
     78                 e.cap-=d;
     79                 G[e.to][e.rev].cap+=d;
     80                 return d;
     81             }
     82         }
     83     }
     84     return 0;
     85 }
     86 
     87 int max_flow(int s,int t){
     88     int flow=0;
     89     while(1){
     90         bfs(s);
     91         if(level[t]<0) return flow;
     92         memset(iter,0,sizeof(iter));
     93         int f;
     94         while((f=dfs(s,t,INF))>0){
     95             flow+=f;
     96         }
     97     }
     98 }
     99 int A[1010];//猪栏中猪 
    100 int own[1010];
    101 bool used[maxn][maxn];
    102 int main()
    103 {
    104     //猪和顾客 
    105     int n,m;
    106     while(cin>>n>>m){
    107         //超级源点 超级汇点 
    108         int s=0,t=100+1;
    109         for(int i=0;i<maxn;++i)
    110             G[i].clear();
    111         for(int i=1;i<=n;++i){
    112             cin>>A[i];//猪栏i中猪的个数 
    113         }
    114         //最近开启猪栏的人
    115         memset(own,-1,sizeof(own)); 
    116         //是否已经建立边 
    117         memset(used,0,sizeof(used)); 
    118         for(int i=1;i<=m;++i){//第几个顾客 
    119             int tt;
    120             cin>>tt;//钥匙数 
    121             int temp;//猪栏的序号 
    122             for(int j=0;j<tt;++j){
    123                 cin>>temp;
    124                 if(own[temp]<0){//猪栏从未被打开过 
    125                     own[temp]=i;
    126                     //已经建立边,直接容量增加,不去新建边 
    127                     if(used[0][i]){
    128                         for(int k=G[0].size()-1;k>=0;--k){
    129                             if(G[0][k].to==i){
    130                                 G[0][k].cap+=A[temp];
    131                                 break;
    132                             }
    133                         }
    134                     }
    135                     else{
    136                         add_edge(0,i,A[temp]);
    137                         used[0][i]=1;
    138                     }
    139                 }
    140                 else{
    141                     int q=own[temp];
    142                     if(!used[q][i]){
    143                         add_edge(q,i,INF);
    144                         used[q][i]=1;
    145                     }
    146                     own[temp]=i;
    147                 }
    148             }
    149             cin>>temp;
    150             add_edge(i,t,temp);
    151         }
    152         cout<<max_flow(s,t)<<endl;
    153     }
    154     return 0;
    155 }
  • 相关阅读:
    C#在winform上实现关于treeview与listview结合项目应用
    C#自学总结_Day2
    Base64 替换 BASE64Encoder
    MySql添加用户
    C#多线程服务,控制最大线程并发和最小线程并发
    C#/.net 移除URL上指定的参数,不区分参数大小写
    C#.NET根据数据库中0,1返回对应代表含义“男”,“女”等问题
    d3 学习记录-----network实现
    c#判断串口是否断开,并自动重连
    winform Anchor和Dock属性
  • 原文地址:https://www.cnblogs.com/baobaopangzi88/p/4111827.html
Copyright © 2020-2023  润新知