网络流/poj1698 Alice's Chance

题意

  有N部电影,分别可以在一个星期的几天拍摄,并可以拍W个星期,Alice可以有D个星期拍这部电影,一天只能拍一部电影。问Alice能否拍完所有电影

分析

  这题直接把每天看成一个点,每部电影也看成一个点,然后源点与电影连接,容量为要求天数,电影与能工作的那些天连容量为1的边,每天再连一条容量为1 的边到汇,最大流为所有要求天数之和就是Yes

Accepted Code

 1 /*
 2     PROBLEM:poj1698
 3     AUTHER:Rinyo
 4     MEMO:网络流
 5 */
 6 #include<cstdio>
 7 #include<queue>
 8 #include<cstring>
 9 using namespace std;
10 int a[372][10],map[372][372],dis[372];
11 int s,t;
12 int bfs()
13 {
14     queue<int> q;
15     memset(dis,-1,sizeof(dis));
16     dis[t]=0;
17     q.push(t);
18     while (!q.empty())
19     {
20         int k=q.front();
21         q.pop();
22         for (int i=0;i<372;i++)
23         {
24             if (dis[i]==-1 && map[i][k])
25             {
26                 dis[i]=dis[k]+1;
27                 q.push(i);
28             }
29         }
30         if (k==s) return 1;
31     }
32     return 0;
33 }
34 
35 int dfs(int now,int v)
36 {
37     if (now==371) return v;
38     int tmp=v;
39     for (int i=0;i<372 && tmp;i++)
40     {
41         if (dis[i]+1==dis[now] && map[now][i])
42         {
43             int t=dfs(i,min(map[now][i],tmp));
44             map[now][i]-=t;
45             map[i][now]+=t;
46             tmp-=t;
47         }
48     }
49     return v-tmp;
50 }
51 int main()
52 {
53     freopen("in.txt","r",stdin);
54     int cnt,ans;
55     scanf("%d",&cnt);
56     while (cnt--)
57     {
58         ans=s=0;t=371;
59         memset(map,0,sizeof(map));
60         memset(a,0,sizeof(a));
61         int n;
62         scanf("%d",&n);
63         for (int i=1;i<=n;i++)
64         {
65             for (int j=1;j<=9;j++) scanf("%d",&a[i][j]);
66             ans+=a[i][8];
67         }
68         for (int i=1;i<=n;i++)
69         {
70             map[0][i+350]=a[i][8];
71             for (int j=1;j<=7;j++)
72             {
73                 if (a[i][j])
74                 {
75                     for (int k=0;k<a[i][9];k++) map[i+350][j+k*7]=1;
76                 }
77             }
78         }
79         for (int i=1;i<=350;i++) map[i][371]=1;
80         int maxflow=0;
81         while (bfs()) maxflow+=dfs(0,2147483647);
82         if (ans==maxflow) printf("Yes\n");
83         else printf("No\n");
84     }
85     return 0;
86 }

 

转载于:https://www.cnblogs.com/Rinyo/archive/2013/03/24/2979701.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值