• poj3436ACM Computer Factory(最大流)


    http://poj.org/problem?id=3436

    刚开始做的没拆点 BFS的时候保存了下路径 恰好样例都过了 接着就是各种WA

    搜了搜解题报告 是将一个电脑拆成2个点 这两点之间限制容量 电脑与电脑之间容量为INF 设置一个源点和汇点  源点全是0 汇点全是1

    不用保存路径 在最后 比较一下现在的容量和原始容量 差值就为W

    View Code
      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<queue>
      6 using namespace std;
      7 #define INF 0x3f3f3f
      8 int n,m;
      9 struct node
     10 {
     11     int s[15],d[15];
     12     int q;
     13 }ma[110];
     14 int path[110],flow[110],map[110][110],st,en,tmap[110][110];
     15 int bfs()
     16 {
     17     int i,j,k;
     18     memset(path,-1,sizeof(path));
     19     for(i = 0 ; i <= en ; i++)
     20     flow[i] = INF;
     21     queue<int>q;
     22     q.push(0);
     23     while(!q.empty())
     24     {
     25         int tk = q.front();
     26         q.pop();
     27         if(tk==en)
     28         break;
     29         for(i = 1 ; i <= en ; i++)
     30         {
     31             if(path[i]==-1&&map[tk][i])
     32             {
     33                 path[i] = tk;
     34                 flow[i] = min(flow[tk],map[tk][i]);
     35                 q.push(i);
     36             }
     37         }
     38     }
     39     if(path[en]==-1)
     40     return -1;
     41     return flow[en];
     42 }
     43 int karp()
     44 {
     45     int i,j,k,now,pre,sum=0;
     46     while((k=bfs())!=-1)
     47     {
     48         sum+=k;
     49         now = en;
     50         while(now!=st)
     51         {
     52             pre = path[now];
     53             map[pre][now]-=k;
     54             map[now][pre]+=k;
     55             now = pre;
     56         }
     57     }
     58     return sum;
     59 }
     60 int main()
     61 {
     62     int i,j,k,g;
     63     while(cin>>n>>m)
     64     {
     65         memset(map,0,sizeof(map));
     66         memset(tmap,0,sizeof(tmap));
     67         for(i = 1; i <= m ; i++)
     68         {
     69             cin>>ma[i].q;
     70             for(j = 1 ; j <= n ; j++)
     71             cin>>ma[i].s[j];
     72             for(j = 1; j <= n; j++)
     73             cin>>ma[i].d[j];
     74             map[i][i+m] = ma[i].q;
     75             tmap[i][i+m] = ma[i].q;
     76         }
     77         for(i = 1; i <= m ; i++)
     78         {
     79             int f = 1;
     80             for(j = 1; j <= n ; j++)
     81             if(ma[i].s[j]==1)
     82             {
     83                 f = 0;
     84                 break;
     85             }
     86             if(f)
     87             {
     88                 map[0][i] = INF;
     89                 tmap[0][i] = INF;
     90             }
     91         }
     92         for(i = 1; i <= m ; i++)
     93         {
     94             int f = 1;
     95             for(j = 1; j <= n ; j++)
     96             if(ma[i].d[j]!=1)
     97             {
     98                 f = 0;
     99                 break;
    100             }
    101             if(f)
    102             {
    103                 map[i+m][2*m+1] = INF;
    104                 tmap[i+m][2*m+1] = INF;
    105             }
    106         }
    107         for(i = 1; i <= m ; i++)
    108         for(j = 1; j <= m ; j++)
    109         {
    110             int flag = 1;
    111             if(i==j)
    112             continue;
    113             for(g = 1; g <= n ; g++)
    114             {
    115                 if(ma[j].s[g]==2)
    116                 continue;
    117                 if(ma[i].d[g]!=ma[j].s[g])
    118                 {
    119                     flag = 0;
    120                     break;
    121                 }
    122             }
    123             if(flag)
    124             {
    125                 map[i+m][j] = INF;
    126                 tmap[i+m][j] = map[i+m][j];
    127             }
    128         }
    129         en = 2*m+1;st = 0;
    130         int num = 0;
    131         int ss  = karp();
    132         for(i = m+1; i < en ;i++)
    133         for(j = 1 ; j <= m ; j++)
    134         if(i!=j&&map[i][j]<tmap[i][j])
    135         num++;
    136         cout<<ss<<" "<<num<<endl;
    137         for(i = m+1; i < en ;i++)
    138         for(j = 1 ; j <= m ; j++)
    139         if(i!=j&&map[i][j]<tmap[i][j])
    140         {
    141             cout<<i-m<<" "<<j<<" "<<tmap[i][j]-map[i][j]<<endl;
    142         }
    143     }
    144     return 0;
    145 }
  • 相关阅读:
    二分法查找算法
    [Java]事件驱动程序设计
    spring 事件驱动模型简介
    事件驱动模型实例详解(Java篇)
    协程
    事件驱动模型的简单Java实现
    负载均衡技术(一)———负载均衡技术介绍
    知物由学 | 未来50年网络安全行业发展愿景
    知物由学 | 如何从勒索软件的攻击中全身而退
    “网易大数据讲堂第一期:数说”直播活动资料:课程回放收看及PPT下载
  • 原文地址:https://www.cnblogs.com/shangyu/p/2817876.html
Copyright © 2020-2023  润新知