您的位置:首页 > 其它

poj 1698

2013-04-14 19:37 246 查看
网络流

#include <iostream>

#include<stdio.h>

#include<string.h>

using namespace std;

const int inf=1<<30;

const int maxn=1001;

int e[maxn][maxn];

int que[maxn],test[maxn],from[maxn];

int bfs(int s,int t,int n)

{

memset(test,0,sizeof(test));

int
top=0;

que[++top]=s;

test[s]=1;

for(int
i=1;i<=top;i++)

for(int
j=1;j<=n;j++)

if(e[que[i]][j]&&test[j]==0)

{

//
printf("%d\n",top);

test[j]=1;

que[++top]=j;

from[j]=que[i];

if(j==t)

{

int ret=inf;

for(int k=t;k!=s;k=from[k])

if(ret>e[from[k]][k])

ret=e[from[k]][k];

for(int k=t;k!=s;k=from[k])

{

e[from[k]][k]-=ret;

e[k][from[k]]+=ret;

}

//
for(int k=t;from[k]!=-1;k=from[k])

//
printf("%d %d\n",from[k],k);

//
printf("%d\n",ret);

return(ret);

}

}

return(0);

}

int ek(int s,int t,int n)

{

int
ans=0;

while(1)

{

int ret=bfs(s,t,n);

if(ret==0) break;

ans+=ret;

}

//
printf("%d\n",ans);

return(ans);

}

int main()

{

//
freopen("in.txt","r",stdin);

int
tcase;

scanf("%d",&tcase);

while(tcase--)

{

memset(e,0,sizeof(e));

int film,week[50][10],big=0,sum=0;

scanf("%d",&film);

for(int k=1;k<=film;k++)

{

for(int i=1;i<=9;i++)
scanf("%d",&week[k][i]);

for(int i=1;i<=7;i++)

if(week[k][i])

for(int j=0;j<week[k][9];j++)

e[1+j*7+i+film][k+1]=1;

if(big<week[k][9]) big=week[k][9];

sum+=week[k][8];

}

for(int i=1+film+1;i<=1+film+big*7;i++)

e[1][i]=1;

for(int i=2;i<=film+1;i++)

e[i][1+film+big*7+1]=week[i-1][8];

if(sum==ek(1,1+film+big*7+1,1+film+big*7+1))

printf("Yes\n");

else

printf("No\n");

}

return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: