zoukankan      html  css  js  c++  java
  • poj1698

    题解:

    网络流

    然后似乎反着做块?

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int N=405;
    int T,qq[8],vvis,q[N*10],n,m,t,l,sum,dis[N],x,y,ans,f[N],z,a[N][N];
    int bfs()
    {
        memset(dis,0xff,sizeof dis);
        dis[n]=0;
        int l=0,r=1;
        q[1]=n;
        while (l<r)
         {
             int j=q[++l];
             for (int i=1;i<=n;i++)
              if (dis[i]<0&&a[i][j]>0)
               {
                   dis[i]=dis[j]+1;
                   q[++r]=i;
               }
             if (j==1)return 1;  
         }
        return 0; 
    }
    int dfs(int x,int y)
    {  
        if (x==n)return y;        
        int tmp=y,t;  
        for (int i=1;i<=n&&tmp;i++)
         if (dis[i]+1==dis[x]&&a[x][i])
          {  
            t=dfs(i,min(a[x][i],tmp));  
            a[x][i]-=t;  
            a[i][x]+=t;  
            tmp-=t;  
          }  
        return y-tmp;  
    }
    int main()
    {
        scanf("%d",&T);
        while (T--)
         {
             vvis=0;
             scanf("%d",&n);
             memset(a,0,sizeof a);
            for (int k=1;k<=n;k++)
              {
                 for (int i=0;i<7;i++)scanf("%d",&qq[i]);
                 scanf("%d%d",&t,&l);
                 vvis+=t;
                for (int j=0;j<7;j++)
                 if (qq[j])for (int i=0;i<l;i++)a[351+k][i*7+j+2]=1;
                a[1][k+351]=t;
             }
            for (int i=2;i<=351;i++)a[i][372]=1; 
            n=372; 
            ans=0;int t; 
            while (bfs())ans+=dfs(1,1e9);
            if (ans==vvis)puts("Yes");
            else puts("No"); 
         }
    }
  • 相关阅读:
    string subscript out of range
    基数树(radix tree)
    改进版的快速排序
    快速排序算法-C语言实现
    归并排序
    用数组名做函数参数(转)
    堆和栈的区别
    给指针malloc分配空间后就等于数组吗?
    codeblocks中添加-std=c99
    堆排序-C语言实现
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8325484.html
Copyright © 2011-2022 走看看