您的位置:首页 > 其它

poj 1698 Alice's Chance SAP 最大流

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

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

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
#define maxx 400
#define INF 9999999

int c[maxx][maxx],f[maxx][maxx],p[maxx], a[maxx];

void add(int u,int v,int w)
{
c[u][v]=w;

}

int maxflow(int s,int t,int n)
{
queue<int> q;
memset(f,0,sizeof(f));
int flow=0;
while(1)
{
memset(a,0,sizeof(a));
a[s] = INF;
q.push(s);

while(!q.empty())
{
int u = q.front();
q.pop();
for(int v = 1; v <= n; v++) if(!a[v] && c[u][v] > f[u][v])
{
p[v] = u;
q.push(v);
a[v] = min(a[u], c[u][v]-f[u][v]);
}
}

if(a[t] == 0)
break;
for(int u = t; u != s; u = p[u])
{
f[p[u]][u] += a[t];
f[u][p[u]] -= a[t];
}
flow += a[t];
}
return flow;
}

int main()
{
int cnt,n;
scanf("%d",&cnt);
while(cnt--)
{
scanf("%d",&n);
memset(c,0,sizeof(c));
int ok[10],day,week,tt=371,tot=0;
for(int i=1; i<=n; i++)
{
for(int j=0; j<7; j++)
scanf("%d",&ok[j]);
scanf("%d%d",&day,&week);
tot+=day;
add(0,i,day);
for(int j=0; j<week; j++)
for(int k=0; k<7; k++)
{
if(ok[k])
add(i,j*7+k+n+1,1);
add(j*7+k+n+1,tt,1);
}
}
int flow;
flow=maxflow(0,tt,tt);
//printf("flow  %d\n",flow);
if(tot==flow)
printf("Yes\n");
else printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: