这题EK为什么T了
  • 板块P4003 无限之环
  • 楼主wxh666
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/25 22:05
  • 上次更新2023/11/3 01:11:49
查看原帖
这题EK为什么T了
342494
wxh666楼主2023/8/25 22:05
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace wxh666{
	#define getchar getchar_unlocked
	#define putchar putchar_unlocked
	#define sqrt(a) __builtin_sqrt(a)
	#define f(a,b,c) for(int a=b;a<=c;a++)
	#define ff(a,b,c) for(int a=b;a>=c;a--)
	// template<typename T>
    // inline T max(T x,T y) {return ((x)>(y)?(x):y);}
	// template<typename T,typename ...Args>
    // inline T max(T x,Args ...xs) {return max(x,max(xs...));}
	// template<typename T>
    // inline T min(T x,T y) {return ((x)<(y)?(x):y);}
	// template<typename T,typename ...Args>
    // inline T min(T x,Args ...xs) {return min(x,min(xs...));}
	template<typename T>
	inline void read(T &ans)
	{
		char ch=getchar();int f=1;ans=0;
		for(;!isdigit(ch);ch=getchar()) ch=='-'?f=-1:f=1;
		for(;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+(ch&15);
		ans*=f;
		return;
	}
	template<typename T,typename ...Args>
	inline void read(T &tmp,Args &...tmps){read(tmp);read(tmps...);}
	inline int read()
	{
		char ch=getchar();int f=1,ans=0;
		for(;!isdigit(ch);ch=getchar()) ch=='-'?f=-1:f=1;
		for(;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+(ch&15);
		return f*ans;
	}
	#define in read()
	template<typename T>
	inline void pu(T x)
	{
		ios::sync_with_stdio(false);
		cout<<x;
		ios::sync_with_stdio(true);
		return;
	}
	template<typename T>
	inline void pk(T x)
	{
		ios::sync_with_stdio(false);
		cout<<x<<" ";
		ios::sync_with_stdio(true);
		return;
	}
	inline void pk(char x)
	{
		ios::sync_with_stdio(false);
		cout<<x;
		if(x!='\n') cout<<' ';
		ios::sync_with_stdio(true);
		return;
	}
	template<typename T,typename ...Args>
	inline void pu(T x,Args ...xs){pu(x);pu(xs...);}
	template<typename T,typename ...Args>
	inline void ppu(T x,Args ...xs){pu(x,xs...,'\n');}
	template<typename T,typename ...Args>
	inline void pk(T x,Args ...xs){pk(x);pk(xs...);}
	template<typename T,typename ...Args>
	inline void ppk(T x,Args ...xs){pk(x,xs...,'\n');}
	#define cs(dt,n,m) \
	for(int i=1;i<=n;i++)\
	{\
		for(int j=1;j<=n;j++)\
			printf("%d ",dt[i][j]);\
		cout<<endl;\
	}
};using namespace wxh666;
namespace lsq {
    typedef int lsqxx;
    struct lq {
        struct lqbz {
            lsqxx v,w,c,nxt;
        } e[5000005];
        lsqxx h[5000005],cnt=1;
        inline void add(lsqxx u,lsqxx v,lsqxx w,lsqxx c) {
            e[++cnt].v=v;
            e[cnt].w=w;
            e[cnt].c=c;
            e[cnt].nxt=h[u];
            h[u]=cnt;
        }
    void erase() {cnt=0;memset(h,0,sizeof(h));return;}
    #define F(z,u) for(int j=z.h[u],v=z.e[j].v,w=z.e[j].w,c=z.e[j].c;j;j=z.e[j].nxt,v=z.e[j].v,w=z.e[j].w,c=z.e[j].c)
    }q;
};
using namespace lsq;
int n,m,s,t,ce,all;
int dt[2005][2005];
int x;
int bcnt;
inline int two_one(int x,int y,int f)
{
    return f*ce+(x-1)*m+y;
}
inline void adds(int u,int v,int w,int c,int z_f)
{
    if(z_f) q.add(u,v,w,c),q.add(v,u,0,-c);
    if(!z_f) q.add(v,u,w,c),q.add(u,v,0,-c);
}
int dis[2005],incf[2005],pre[2005];
bool spfa()
{
    int vis[2005]={0};
    memset(dis,0x3f,sizeof(dis));
    queue<int>p;
    p.push(s);
    dis[s]=0;
    vis[s]=1;
    incf[s]=1<<30;
    while(!p.empty())
    {
        int u=p.front();p.pop();vis[u]=0;
        F(q,u)
        {
            if(!w) continue;
            if(dis[v]<=dis[u]+c) continue;
            dis[v]=dis[u]+c;
            incf[v]=min(incf[u],w);
            pre[v]=j;
            if(vis[v]) continue;
            vis[v]=1,p.push(v);
        }
    }
    if(dis[t]==0x3f3f3f3f3f3f3f3f) return false;
    else return true;
}
void EK()
{
    int ans,cans;
    ans=cans=0;
    while(spfa())
    {
        ans+=incf[t];
        cans+=dis[t]*incf[t];
        int now=t;
        int k;
        while(now!=s)
        {
            k=pre[now];
            q.e[k].w-=incf[t];
            q.e[k^1].w+=incf[t];
            now=q.e[k^1].v;
        }
    }
    if(ans!=bcnt/2)
        puts("-1");
    else
        ppk(cans);
}
signed main()
{
    cin>>n>>m;s=0;t=n*m*5+1;all=t+1;ce=n*m;
    f(i,1,n) f(j,1,m)
    {
        scanf("%lld",&x);
        if((i+j)&1) q.add(s,two_one(i,j,0),INT_MAX,0),
                    q.add(two_one(i,j,0),s,0,0);
        else q.add(two_one(i,j,0),t,INT_MAX,0),
             q.add(t,two_one(i,j,0),0,0);
        if((i+j)&1)
        {
            int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
            f(k,1,4)
            {
                int xx=i+dx[k],yy=j+dy[k];
                if(xx<1||yy<1||xx>n||yy>m) continue;
                int tos=(k+2);if(tos>=5) tos=tos%5+1;
                q.add(two_one(i,j,k),two_one(xx,yy,tos),1,0);
                q.add(two_one(xx,yy,tos),two_one(i,j,k),0,0);
            }
        }
        switch(x)
        {
            
            //left down right up
            case 1:bcnt++;
                adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
                adds(two_one(i,j,1),two_one(i,j,2),1,1,(i+j)&1);
                adds(two_one(i,j,1),two_one(i,j,3),1,2,(i+j)&1);
                adds(two_one(i,j,1),two_one(i,j,4),1,1,(i+j)&1);
                break;
            case 2:bcnt++;
                adds(two_one(i,j,2),two_one(i,j,1),1,1,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
                adds(two_one(i,j,2),two_one(i,j,3),1,1,(i+j)&1);
                adds(two_one(i,j,2),two_one(i,j,4),1,2,(i+j)&1);
                break;
            case 4:bcnt++;
                adds(two_one(i,j,3),two_one(i,j,1),1,2,(i+j)&1);
                adds(two_one(i,j,3),two_one(i,j,2),1,1,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
                adds(two_one(i,j,3),two_one(i,j,4),1,1,(i+j)&1);
                break;
            case 8:bcnt++;
                adds(two_one(i,j,4),two_one(i,j,1),1,1,(i+j)&1);
                adds(two_one(i,j,4),two_one(i,j,2),1,2,(i+j)&1);
                adds(two_one(i,j,4),two_one(i,j,3),1,1,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
                break;
            //only one


            //left down right up
            case 3:bcnt+=2;
                adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
                adds(two_one(i,j,1),two_one(i,j,3),1,1,(i+j)&1);
                adds(two_one(i,j,2),two_one(i,j,4),1,1,(i+j)&1);
                break;
            case 6:bcnt+=2;
                adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
                adds(two_one(i,j,3),two_one(i,j,1),1,1,(i+j)&1);
                adds(two_one(i,j,2),two_one(i,j,4),1,1,(i+j)&1);
                break;
            case 9:bcnt+=2;
                adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
                adds(two_one(i,j,4),two_one(i,j,2),1,1,(i+j)&1);
                adds(two_one(i,j,1),two_one(i,j,3),1,1,(i+j)&1);
                break;
            case 12:bcnt+=2;
                adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
                adds(two_one(i,j,4),two_one(i,j,2),1,1,(i+j)&1);
                adds(two_one(i,j,3),two_one(i,j,1),1,1,(i+j)&1);
                break;
            //about 7




            //left down right up
            case 5:bcnt+=2;
                adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
                break;
            case 10:bcnt+=2;
                adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
                break;
            //straight




            //left down right up
            case 7:bcnt+=3;
                adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
                adds(two_one(i,j,1),two_one(i,j,4),1,1,(i+j)&1);
                adds(two_one(i,j,2),two_one(i,j,4),1,2,(i+j)&1);
                adds(two_one(i,j,3),two_one(i,j,4),1,1,(i+j)&1);
                break;
            case 11:bcnt+=3;
                adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
                adds(two_one(i,j,1),two_one(i,j,3),1,2,(i+j)&1);
                adds(two_one(i,j,2),two_one(i,j,3),1,1,(i+j)&1);
                adds(two_one(i,j,4),two_one(i,j,3),1,1,(i+j)&1);
                break;
            case 13:bcnt+=3;
                adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
                adds(two_one(i,j,4),two_one(i,j,2),1,2,(i+j)&1);
                adds(two_one(i,j,1),two_one(i,j,2),1,1,(i+j)&1);
                adds(two_one(i,j,3),two_one(i,j,2),1,1,(i+j)&1);
                break;
            case 14:bcnt+=3;
                adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
                adds(two_one(i,j,2),two_one(i,j,1),1,1,(i+j)&1);
                adds(two_one(i,j,3),two_one(i,j,1),1,2,(i+j)&1);
                adds(two_one(i,j,4),two_one(i,j,1),1,1,(i+j)&1);
                break;
            //about T




            //left down right up
            case 15:bcnt+=4;
                adds(two_one(i,j,0),two_one(i,j,1),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,2),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,3),1,0,(i+j)&1);
                adds(two_one(i,j,0),two_one(i,j,4),1,0,(i+j)&1);
                break;
            //about +
        }
    }
    EK();
	return 0;
}
2023/8/25 22:05
加载中...