2 条题解

  • 0
    @ 2025-10-8 16:57:27
    #include <bits/stdc++.h>
    using namespace std;
    const int N=5100,M=2e5+10;
    struct edge{int x,y,f,c,pre;}a[M];int alen,last[N],cur[N];
    void ins(int x,int y,int f,int c)
    {
        a[++alen]={x,y,f,c,last[x]};last[x]=alen;
        a[++alen]={y,x,0,-c,last[y]};last[y]=alen;
    }
    int n,st,ed,d[N];bool v[N];
    bool spfa()
    {
        queue<int> q;
        memset(d,0x8f,sizeof(d));d[st]=0;
        memset(v,0,sizeof(v));
        q.push(st);v[st]=1;
        while(!q.empty())
    	{
            int x=q.front();q.pop();v[x]=0;
            for(int k=last[x];k;k=a[k].pre)if(a[k].f)
    		{
                int y=a[k].y;
                if(d[y]<d[x]+a[k].c)
    			{
                    d[y]=d[x]+a[k].c;
                    if(!v[y])q.push(y),v[y]=1;
                }
            }    
        }
        return d[ed]!=d[0];
    }
    int ans;
    int dinic(int x,int f)
    {
        if(x==ed) return ans+=d[ed]*f,f;
        int sx=0;
        v[x]=1;
        for(int k=cur[x];k;k=a[k].pre)if(a[k].f)
    	{
            cur[x]=k;
            int y=a[k].y;if(v[y])continue;
            if(d[y]==a[k].c+d[x])
    		{
                int sy=dinic(y,min(f-sx,a[k].f));
                a[k].f-=sy,a[k^1].f+=sy;
                sx+=sy;if(sx==f) return f;
            }
        }
        if(sx>0)v[x]=0;
        return sx;
    }
    int id(int i,int j,int k){return (i-1)*n+j+k*n*n;}
    int main()
    {
        int k;scanf("%d%d",&n,&k);
    	alen=1;memset(last,0,sizeof(last));
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
    	{
            int c;scanf("%d",&c);
            ins(id(i,j,0),id(i,j,1),1,c);
    		ins(id(i,j,0),id(i,j,1),k-1,0);
    		if(j<n) ins(id(i,j,1),id(i,j+1,0),k,0);
    		if(i<n) ins(id(i,j,1),id(i+1,j,0),k,0);
        }
        st=1,ed=2*n*n;
        ans=0;
        while(spfa())
    	{
            memcpy(cur,last,sizeof(cur));
            int t=dinic(st,1<<30);
        }
        printf("%d\n",ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:57:12
      #include<bits/stdc++.h>
      using namespace std;
      const int N=5100,M=2e5+10;
      struct edge{int x,y,f,c,pre;}a[M];int alen,last[N],cur[N];
      void ins(int x,int y,int f,int c)
      {
          a[++alen]={x,y,f,c,last[x]};last[x]=alen;
          a[++alen]={y,x,0,-c,last[y]};last[y]=alen;
      }
      int n,st,ed,d[N];bool v[N];
      bool spfa()
      {
          queue<int> q;
          memset(d,0x8f,sizeof(d));d[st]=0;
          memset(v,0,sizeof(v));
          q.push(st);v[st]=1;
          while(!q.empty())
      	{
              int x=q.front();q.pop();v[x]=0;
              for(int k=last[x];k;k=a[k].pre)if(a[k].f)
      		{
                  int y=a[k].y;
                  if(d[y]<d[x]+a[k].c)
      			{
                      d[y]=d[x]+a[k].c;
                      if(!v[y])q.push(y),v[y]=1;
                  }
              }    
          }
          return d[ed]!=d[0];
      }
      int ans;
      int dinic(int x,int f)
      {
          if(x==ed) return ans+=d[ed]*f,f;
          int sx=0;
          v[x]=1;
          for(int k=cur[x];k;k=a[k].pre)if(a[k].f)
      	{
              cur[x]=k;
              int y=a[k].y;if(v[y])continue;
              if(d[y]==a[k].c+d[x])
      		{
                  int sy=dinic(y,min(f-sx,a[k].f));
                  a[k].f-=sy,a[k^1].f+=sy;
                  sx+=sy;if(sx==f) return f;
              }
          }
          if(sx>0)v[x]=0;
          return sx;
      }
      int id(int i,int j,int k){return (i-1)*n+j+k*n*n;}
      int main()
      {
          int k;scanf("%d%d",&n,&k);
      	alen=1;memset(last,0,sizeof(last));
          for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
      	{
              int c;scanf("%d",&c);
              ins( id(i,j,0), id(i,j,1),1,c);
      		ins( id(i,j,0), id(i,j,1), k-1, 0);
      		if(j<n) ins( id(i,j,1), id(i,j+1,0), k,0);
      		if(i<n) ins( id(i,j,1), id(i+1,j,0), k,0);
          }
          st=1,ed=2*n*n;
          ans=0;
          while(spfa())
      	{
              memcpy(cur,last,sizeof(cur));
              int t=dinic(st,1<<30);
          }
          printf("%d\n",ans);
          return 0;
      }
      • 1

      *【最大费用流】K取方格数[POJ3422 | luogu P2045]

      信息

      ID
      1471
      时间
      1000ms
      内存
      64MiB
      难度
      5
      标签
      递交数
      55
      已通过
      23
      上传者