2 条题解

  • 0
    @ 2025-10-8 16:49:27
    #include<bits/stdc++.h>
    using namespace std;
    const int N=250, MM=1e6;
    struct edge{int x,y,f,pre;}a[MM];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[250],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>0;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=last[x];k;k=a[k].pre)if(a[k].f)
        {
            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,K,C,M,Map[250][250];
    bool check(int mid)
    {
        alen=1;memset(last,0,sizeof(last));
        for(int i=K+1;i<=K+C;i++)
            for(int j=1;j<=K;j++)
                if(Map[i][j]<=mid)ins(i,j,1);
        for(int i=1;i<=K;i++)ins(i,ed,M);
        for(int i=K+1;i<=K+C;i++)ins(st,i,1);
        int s=0;
        while(bfs()==1)
        {
            memcpy(cur,last,sizeof(last));
            s+=dinic(st,C);
        }
        return s==C;
    }
    int main()
    {
        scanf("%d%d%d",&K,&C,&M);n=K+C;
        st=n+1;ed=n+2;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&Map[i][j]);
                if(Map[i][j]==0)Map[i][j]=50000;
            }
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)if(i!=k)
                for(int j=1;j<=n;j++)if(j!=k&&j!=i)
                    Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]);
        int L=0,R=50000,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:14
      #include<bits/stdc++.h>
      using namespace std;
      const int N=250,MM=1e6;
      struct edge{int x,y,f,pre;}a[MM];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[250],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>0;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=last[x];k;k=a[k].pre)if(a[k].f)
          {
              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,K,C,M,Map[250][250];
      bool check(int mid)
      {
          alen=1;memset(last,0,sizeof(last));
          for(int i=K+1;i<=K+C;i++)
              for(int j=1;j<=K;j++)
                  if(Map[i][j]<=mid)ins(i,j,1);
          for(int i=1;i<=K;i++)ins(i,ed,M);
          for(int i=K+1;i<=K+C;i++)ins(st,i,1);
          int s=0;
          while(bfs()==1)
          {
          	memcpy(cur,last,sizeof(last));
              s+=dinic(st,C);
          }
          return s==C;
      }
      int main()
      {
          scanf("%d%d%d",&K,&C,&M);n=K+C;
          st=n+1;ed=n+2;
          for(int i=1;i<=n;i++)
              for(int j=1;j<=n;j++)
              {
                  scanf("%d",&Map[i][j]);
      			if(Map[i][j]==0)Map[i][j]=50000;
              }
          for(int k=1;k<=n;k++)
              for(int i=1;i<=n;i++)if(i!=k)
                  for(int j=1;j<=n;j++)if(j!=k&&j!=i)
                      Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]);
          int L=0,R=50000,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)】牛挤奶

      信息

      ID
      311
      时间
      1000ms
      内存
      128MiB
      难度
      4
      标签
      递交数
      78
      已通过
      34
      上传者