ZJNU 1216 - 战争——高级 (最短路)

ZJNU 1216 - 战争——高级

题面

pic

思路

要求删去最少边权和,使得左上角与右下角不连通,即最小割的模型,但数据规模\(500^2\)无法使用

如果我们假设左上角向左上画一条无限延伸的线,右下角向右下画一条无限延伸的线

那么可以将图中的边看作点,图中的连通区域看作边,题目也就转化成了寻找从右上区域走到左下区域的最短路

至此就理论AC了,接下来就是码力问题,处理好三种不同的边之间的关系即可(下面的代码写得很麻烦,但大部分也算是复制粘贴,采用SPFA的方法搜索)

#include<bits/stdc++.h>
#define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define multiCase int T;cin>>T;for(int t=1;t<=T;t++)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i<(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define perr(i,a,b) for(int i=(a);i>(b);i--)
#define all(a) (a).begin(),(a).end()
#define SUM(a) accumulate(all(a),0LL)
#define MIN(a) (*min_element(all(a)))
#define MAX(a) (*max_element(all(a)))
#define mst(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const ll LINF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-12;
const double PI=acos(-1.0);
const ll mod=998244353;
const int dx[8]={0,1,0,-1,1,1,-1,-1},dy[8]={1,0,-1,0,1,-1,1,-1};
void debug(){cerr<<'\n';}template<typename T,typename... Args>void debug(T x,Args... args){cerr<<"[ "<<x<< " ] , ";debug(args...);}
mt19937 mt19937random(std::chrono::system_clock::now().time_since_epoch().count());
ll getRandom(ll l,ll r){return uniform_int_distribution<ll>(l,r)(mt19937random);}
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll qmul(ll a,ll b){ll r=0;while(b){if(b&1)r=(r+a)%mod;b>>=1;a=(a+a)%mod;}return r;}
ll qpow(ll a,ll n){ll r=1;while(n){if(n&1)r=(r*a)%mod;n>>=1;a=(a*a)%mod;}return r;}
ll qpow(ll a,ll n,ll p){ll r=1;while(n){if(n&1)r=(r*a)%p;n>>=1;a=(a*a)%p;}return r;}

int n,m;
ll rd[3][1005][1005]; //水平/竖直/斜边
ll dis[3][1005][1005];
bool vis[3][1005][1005];
struct node
{
    int d,x,y;
    node(){}
    node(int _d,int _x,int _y){
        d=_d;
        x=_x;
        y=_y;
    }
};

void solve()
{
    rep(i,1,n+1)
        rep(j,1,m)
        {
            cin>>rd[0][i][j];
            dis[0][i][j]=LINF;
        }
    rep(i,1,n)
        rep(j,1,m+1)
        {
            cin>>rd[1][i][j];
            dis[1][i][j]=LINF;
        }
    rep(i,1,n*2)
        rep(j,1,m*2)
        {
            cin>>rd[2][i][j];
            dis[2][i][j]=LINF;
        }
    queue<node> q;
    rep(j,1,m)
    {
        q.push(node(0,1,j));
        dis[0][1][j]=rd[0][1][j];
    }
    rep(i,1,n)
    {
        q.push(node(1,i,m+1));
        dis[1][i][m+1]=rd[1][i][m+1];
    }
    
    while(!q.empty())
    {
        node nd=q.front();
        q.pop();
        int &x=nd.x,&y=nd.y,px,py;
        vis[nd.d][x][y]=false;
        if(nd.d==0)
        {
            if(x!=1)
            {
                px=x*2-2,py=y*2-1;
                if(dis[2][px][py]>dis[0][x][y]+rd[2][px][py])
                {
                    dis[2][px][py]=dis[0][x][y]+rd[2][px][py];
                    if(!vis[2][px][py])
                    {
                        vis[2][px][py]=true;
                        q.push(node(2,px,py));
                    }
                }
				px=x*2-2,py=y*2;
                if(dis[2][px][py]>dis[0][x][y]+rd[2][px][py])
                {
                    dis[2][px][py]=dis[0][x][y]+rd[2][px][py];
                    if(!vis[2][px][py])
                    {
                        vis[2][px][py]=true;
                        q.push(node(2,px,py));
                    }
                }
            }
            if(x!=n+1)
            {
                px=x*2-1,py=y*2-1;
                if(dis[2][px][py]>dis[0][x][y]+rd[2][px][py])
                {
                    dis[2][px][py]=dis[0][x][y]+rd[2][px][py];
                    if(!vis[2][px][py])
                    {
                        vis[2][px][py]=true;
                        q.push(node(2,px,py));
                    }
                }
                px=x*2-1,py=y*2;
                if(dis[2][px][py]>dis[0][x][y]+rd[2][px][py])
                {
                    dis[2][px][py]=dis[0][x][y]+rd[2][px][py];
                    if(!vis[2][px][py])
                    {
                        vis[2][px][py]=true;
                        q.push(node(2,px,py));
                    }
                }
            }
        }
        else if(nd.d==1)
        {
            if(y!=1)
            {
                px=x*2-1,py=y*2-2;
                if(dis[2][px][py]>dis[1][x][y]+rd[2][px][py])
                {
                    dis[2][px][py]=dis[1][x][y]+rd[2][px][py];
                    if(!vis[2][px][py])
                    {
                        vis[2][px][py]=true;
                        q.push(node(2,px,py));
                    }
                }
                px=x*2,py=y*2-2;
                if(dis[2][px][py]>dis[1][x][y]+rd[2][px][py])
                {
                    dis[2][px][py]=dis[1][x][y]+rd[2][px][py];
                    if(!vis[2][px][py])
                    {
                        vis[2][px][py]=true;
                        q.push(node(2,px,py));
                    }
                }
            }
            if(y!=m+1)
            {
                px=x*2-1,py=y*2-1;
                if(dis[2][px][py]>dis[1][x][y]+rd[2][px][py])
                {
                    dis[2][px][py]=dis[1][x][y]+rd[2][px][py];
                    if(!vis[2][px][py])
                    {
                        vis[2][px][py]=true;
                        q.push(node(2,px,py));
                    }
                }
                px=x*2,py=y*2-1;
                if(dis[2][px][py]>dis[1][x][y]+rd[2][px][py])
                {
                    dis[2][px][py]=dis[1][x][y]+rd[2][px][py];
                    if(!vis[2][px][py])
                    {
                        vis[2][px][py]=true;
                        q.push(node(2,px,py));
                    }
                }
            }
        }
        else
        {
            if(x&1)
            {
                if(y&1)
                {
                    px=x,py=y+1;
                    if(dis[2][px][py]>dis[2][x][y]+rd[2][px][py])
                    {
                        dis[2][px][py]=dis[2][x][y]+rd[2][px][py];
                        if(!vis[2][px][py])
                        {
                            vis[2][px][py]=true;
                            q.push(node(2,px,py));
                        }
                    }
                    px=x+1,py=y;
                    if(dis[2][px][py]>dis[2][x][y]+rd[2][px][py])
                    {
                        dis[2][px][py]=dis[2][x][y]+rd[2][px][py];
                        if(!vis[2][px][py])
                        {
                            vis[2][px][py]=true;
                            q.push(node(2,px,py));
                        }
                    }
                    px=(x+1)/2,py=(y+1)/2;
                    if(dis[0][px][py]>dis[2][x][y]+rd[0][px][py])
                    {
                        dis[0][px][py]=dis[2][x][y]+rd[0][px][py];
                        if(!vis[0][px][py])
                        {
                            vis[0][px][py]=true;
                            q.push(node(0,px,py));
                        }
                    }
                    px=(x+1)/2,py=(y+1)/2;
                    if(dis[1][px][py]>dis[2][x][y]+rd[1][px][py])
                    {
                        dis[1][px][py]=dis[2][x][y]+rd[1][px][py];
                        if(!vis[1][px][py])
                        {
                            vis[1][px][py]=true;
                            q.push(node(1,px,py));
                        }
                    }
                }
                else
                {
                    px=x,py=y-1;
                    if(dis[2][px][py]>dis[2][x][y]+rd[2][px][py])
                    {
                        dis[2][px][py]=dis[2][x][y]+rd[2][px][py];
                        if(!vis[2][px][py])
                        {
                            vis[2][px][py]=true;
                            q.push(node(2,px,py));
                        }
                    }
                    px=x+1,py=y;
                    if(dis[2][px][py]>dis[2][x][y]+rd[2][px][py])
                    {
                        dis[2][px][py]=dis[2][x][y]+rd[2][px][py];
                        if(!vis[2][px][py])
                        {
                            vis[2][px][py]=true;
                            q.push(node(2,px,py));
                        }
                    }
                    px=(x+1)/2,py=(y+1)/2;
                    if(dis[0][px][py]>dis[2][x][y]+rd[0][px][py])
                    {
                        dis[0][px][py]=dis[2][x][y]+rd[0][px][py];
                        if(!vis[0][px][py])
                        {
                            vis[0][px][py]=true;
                            q.push(node(0,px,py));
                        }
                    }
                    px=(x+1)/2,py=(y+2)/2;
                    if(dis[1][px][py]>dis[2][x][y]+rd[1][px][py])
                    {
                        dis[1][px][py]=dis[2][x][y]+rd[1][px][py];
                        if(!vis[1][px][py])
                        {
                            vis[1][px][py]=true;
                            q.push(node(1,px,py));
                        }
                    }
                }
            }
            else
            {
                if(y&1)
                {
                    px=x,py=y+1;
                    if(dis[2][px][py]>dis[2][x][y]+rd[2][px][py])
                    {
                        dis[2][px][py]=dis[2][x][y]+rd[2][px][py];
                        if(!vis[2][px][py])
                        {
                            vis[2][px][py]=true;
                            q.push(node(2,px,py));
                        }
                    }
                    px=x-1,py=y;
                    if(dis[2][px][py]>dis[2][x][y]+rd[2][px][py])
                    {
                        dis[2][px][py]=dis[2][x][y]+rd[2][px][py];
                        if(!vis[2][px][py])
                        {
                            vis[2][px][py]=true;
                            q.push(node(2,px,py));
                        }
                    }
                    px=(x+1)/2,py=(y+1)/2;
                    if(dis[1][px][py]>dis[2][x][y]+rd[1][px][py])
                    {
                        dis[1][px][py]=dis[2][x][y]+rd[1][px][py];
                        if(!vis[1][px][py])
                        {
                            vis[1][px][py]=true;
                            q.push(node(1,px,py));
                        }
                    }
                    px=(x+2)/2,py=(y+1)/2;
                    if(dis[0][px][py]>dis[2][x][y]+rd[0][px][py])
                    {
                        dis[0][px][py]=dis[2][x][y]+rd[0][px][py];
                        if(!vis[0][px][py])
                        {
                            vis[0][px][py]=true;
                            q.push(node(0,px,py));
                        }
                    }
                }
                else
                {
                    px=x,py=y-1;
                    if(dis[2][px][py]>dis[2][x][y]+rd[2][px][py])
                    {
                        dis[2][px][py]=dis[2][x][y]+rd[2][px][py];
                        if(!vis[2][px][py])
                        {
                            vis[2][px][py]=true;
                            q.push(node(2,px,py));
                        }
                    }
                    px=x-1,py=y;
                    if(dis[2][px][py]>dis[2][x][y]+rd[2][px][py])
                    {
                        dis[2][px][py]=dis[2][x][y]+rd[2][px][py];
                        if(!vis[2][px][py])
                        {
                            vis[2][px][py]=true;
                            q.push(node(2,px,py));
                        }
                    }
                    px=(x+1)/2,py=(y+2)/2;
                    if(dis[1][px][py]>dis[2][x][y]+rd[1][px][py])
                    {
                        dis[1][px][py]=dis[2][x][y]+rd[1][px][py];
                        if(!vis[1][px][py])
                        {
                            vis[1][px][py]=true;
                            q.push(node(1,px,py));
                        }
                    }
                    px=(x+2)/2,py=(y+1)/2;
                    if(dis[0][px][py]>dis[2][x][y]+rd[0][px][py])
                    {
                        dis[0][px][py]=dis[2][x][y]+rd[0][px][py];
                        if(!vis[0][px][py])
                        {
                            vis[0][px][py]=true;
                            q.push(node(0,px,py));
                        }
                    }
                }
            }
        }
    }
    
    ll ans=LINF;
    rep(j,1,m)
        ans=min(ans,dis[0][n+1][j]);
    rep(i,1,n)
        ans=min(ans,dis[1][i][1]);
    cout<<ans<<'\n';
}
int main()
{
    closeSync;
    while(cin>>n>>m)
    {
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值