poj 1698

网络流

 

 

#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;
}

你可能感兴趣的:(poj 1698)