2 条题解

  • 0
    @ 2025-10-8 16:49:28
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1100, M=51100;
    struct edge{int x,y,f,pre;}a[M];int alen,last[N],cur[N];
    void ins(int x,int y,int f)
    {
        ++alen;a[alen]=edge{x,y,f,last[x]};last[x]=alen;
        ++alen;a[alen]=edge{y,x,0,last[y]};last[y]=alen;
    }
    int h[1100],st,ed;
    bool bfs()
    {
        deque<int>Q;Q.clear();
        memset(h,0,sizeof(h));h[st]=1;
        Q.push_back(st);
        while(!Q.empty())
        {
            int x=Q.front();Q.pop_front();
            for(int k=last[x];k;k=a[k].pre)if(a[k].f)
            {
                int y=a[k].y;
                if(h[y]==0)
                {
                    h[y]=h[x]+1;
                    Q.push_back(y);
                }
            }
            
        }
        return h[ed]>0;
    }
    int dinic(int x,int f)
    {
        if(x==ed)return f;
        int sx=0;
        for(int k=cur[x];k;k=a[k].pre)if(a[k].f)
        {
            cur[x]=k;
            int y=a[k].y;
            if(h[y]==h[x]+1)
            {
                int sy=dinic(y,min(a[k].f,f-sx));
                a[k].f-=sy;a[k^1].f+=sy;
                sx+=sy;if(sx==f) return f;
            }
        }
        if(sx==0)h[x]=0;
        return sx;
    }
    int n,m,p[N][25],B[25];
    bool check(int mid)
    {
        st=n+m+1;ed=n+m+2;
        for (int L=1;L<=m-mid+1;L++)
        {
            int R=L+mid-1;
            alen=1;memset(last,0,sizeof(last));
            for (int i=1;i<=n;i++) ins(st, i, 1);
            for (int i=1;i<=m;i++) ins(n+i, ed, B[i]);
            for (int i=1;i<=n;i++)
                for (int j=L;j<=R;j++)
                    ins(i, n+p[i][j], 1);
               
            int s=0;
            while(bfs())
            {
                memcpy(cur,last,sizeof(last));
                s+=dinic(st,1<<30);
            }
            if(s==n)return 1;
        }
        return 0;
    }
    int main() 
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
                scanf("%d",&p[i][j]);
        for (int i=1;i<=m;i++)scanf("%d",&B[i]);
        int L=1,R=m,ans=-1;
        while(L<=R)
        {
            int mid=(L+R)/2;
            if (check(mid)==1)ans=mid,R=mid-1;
            else L=mid+1;
        }
        printf("%d\n",ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:49:13
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1100,M=51100;
      struct edge{int x,y,f,pre;}a[M];int alen,last[N],cur[N];;
      void ins(int x,int y,int f)
      {
          ++alen;a[alen]=edge{x,y,f,last[x]};last[x]=alen;
          ++alen;a[alen]=edge{y,x,0,last[y]};last[y]=alen;
      }
      int h[1100],st,ed;
      bool bfs()
      {
          deque<int>Q;Q.clear();
      	memset(h,0,sizeof(h));h[st]=1;
          Q.push_back(st);
          while(!Q.empty())
          {
              int x=Q.front();Q.pop_front();
              for(int k=last[x];k;k=a[k].pre)if(a[k].f)
              {
                  int y=a[k].y;
                  if(h[y]==0)
                  {
                      h[y]=h[x]+1;
                      Q.push_back(y);
                  }
              }
              
          }
          return h[ed]>0;
      }
      int dinic(int x,int f)
      {
          if(x==ed)return f;
          int sx=0;
          for(int k=cur[x];k;k=a[k].pre)if(a[k].f)
          {
          	cur[x]=k;
              int y=a[k].y;
              if(h[y]==h[x]+1)
              {
                  int sy=dinic(y,min(a[k].f,f-sx));
                  a[k].f-=sy;a[k^1].f+=sy;
                  sx+=sy;if(sx==f) return f;
              }
          }
          if(sx==0)h[x]=0;
          return sx;
      }
      int n,m,p[N][25],B[25];
      bool check(int mid)
      {
          st=n+m+1;ed=n+m+2;
          for (int L=1;L<=m-mid+1;L++)
          {
              int R=L+mid-1;
              alen=1;memset(last,0,sizeof(last));
              for (int i=1;i<=n;i++) ins(st ,  i , 1   );
              for (int i=1;i<=m;i++) ins(n+i, ed , B[i]);
              for (int i=1;i<=n;i++)
                  for (int j=L;j<=R;j++)
                      ins(i,n+p[i][j],1);
                 
              int s=0;
              while(bfs())
              {
              	memcpy(cur,last,sizeof(last));
                  s+=dinic(st,1<<30);
              }
              if(s==n)return 1;
          }
          return 0;
      }
      int main() 
      {
          scanf("%d%d",&n,&m);
          for (int i=1;i<=n;i++)
              for (int j=1;j<=m;j++)
                  scanf("%d",&p[i][j]);
          for (int i=1;i<=m;i++)scanf("%d",&B[i]);
          int L=1,R=m,ans=-1;
          while(L<=R)
          {
              int mid=(L+R)/2;
              if (check(mid)==1)ans=mid,R=mid-1;
              else                      L=mid+1;
          }
          printf("%d\n",ans);
          return 0;
      }
      • 1

      *【网络流(难度:S7)】牛选圈[USACO06FEB]Steady Cow Assignment G

      信息

      ID
      312
      时间
      1000ms
      内存
      128MiB
      难度
      5
      标签
      递交数
      82
      已通过
      31
      上传者