• poj 1698 Alice's Chance SAP 最大流


    【题意】:Alice有n部电影要拍,规定爱丽丝每部电影在每个礼拜只有固定的几天可以拍电影,只可以拍前面w个礼拜,并且这部电影要拍d天,问爱丽丝能不能拍完所有的电影

    【建图】:源点与每部电影连边,容量为天数,每部电影与可以拍该电影的那些天数连边,容量为1,再所有的天数与汇点连边容量为1。 要注意天数和汇点连边的时候不要重复了,我这里用的数组不会出现这种情况。

     1 #include<iostream>
     2 #include<vector>
     3 #include<cstring>
     4 #include<queue>
     5 #include<cstdio>
     6 using namespace std;
     7 #define maxx 400
     8 #define INF 9999999
     9 
    10 int c[maxx][maxx],f[maxx][maxx],p[maxx], a[maxx];
    11 
    12 void add(int u,int v,int w)
    13 {
    14     c[u][v]=w;
    15     
    16 }
    17 
    18 int maxflow(int s,int t,int n)
    19 {
    20     queue<int> q;
    21     memset(f,0,sizeof(f));
    22     int flow=0;
    23     while(1)
    24     {
    25         memset(a,0,sizeof(a)); 
    26         a[s] = INF; 
    27         q.push(s);  
    28 
    29         while(!q.empty()) 
    30         {
    31             int u = q.front();
    32             q.pop();
    33             for(int v = 1; v <= n; v++) if(!a[v] && c[u][v] > f[u][v]) 
    34                 {
    35                     p[v] = u;
    36                     q.push(v); 
    37                     a[v] = min(a[u], c[u][v]-f[u][v]); 
    38                 }
    39         }
    40 
    41         if(a[t] == 0)
    42             break; 
    43         for(int u = t; u != s; u = p[u]) 
    44         {
    45             f[p[u]][u] += a[t]; 
    46             f[u][p[u]] -= a[t]; 
    47         }
    48         flow += a[t]; 
    49     }
    50     return flow;
    51 }
    52 
    53 int main()
    54 {
    55     int cnt,n;
    56     scanf("%d",&cnt);
    57     while(cnt--)
    58     {
    59         scanf("%d",&n);
    60         memset(c,0,sizeof(c));
    61         int ok[10],day,week,tt=371,tot=0;
    62         for(int i=1; i<=n; i++)
    63         {
    64             for(int j=0; j<7; j++)
    65                 scanf("%d",&ok[j]);
    66             scanf("%d%d",&day,&week);
    67             tot+=day;
    68             add(0,i,day);
    69             for(int j=0; j<week; j++)
    70                 for(int k=0; k<7; k++)
    71                 {
    72                     if(ok[k])
    73                        add(i,j*7+k+n+1,1);
    74                     add(j*7+k+n+1,tt,1);
    75                 }
    76         }
    77         int flow;
    78         flow=maxflow(0,tt,tt);
    79         //printf("flow  %d
    ",flow);
    80         if(tot==flow)
    81             printf("Yes
    ");
    82         else printf("No
    ");
    83     }
    84     return 0;
    85 }
  • 相关阅读:
    云游四海
    保持良好的人际关系,赢得好人缘的八大诀窍
    二十三格经典的管理定律(建议收藏)
    游北湖公园有感
    如何成为领袖? 学习任正非小沃森郭士纳
    梦回江南
    观野花展有感
    爱一个人要爱多久
    醉卧山林
    游环岛路有感
  • 原文地址:https://www.cnblogs.com/assult/p/3947757.html
Copyright © 2020-2023  润新知