zoukankan      html  css  js  c++  java
  • 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<<'
    ';}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<<'
    ';
    }
    int main()
    {
        closeSync;
        while(cin>>n>>m)
        {
            solve();
        }
        return 0;
    }
    

  • 相关阅读:
    数据结构中的图面试题总结
    大数运算
    页面置换算法
    栈的效率为什么比堆高?
    C#获取FTP文件详细备注信息
    WPF DataGrid_SelectChanged获取单元内容
    Python datetime模块参考手册
    Linux下使用 virtualenv 虚拟独立 Python 环境
    Jupyter Notebook 快捷键使用指南
    IPython 基本使用
  • 原文地址:https://www.cnblogs.com/stelayuri/p/15138251.html
Copyright © 2011-2022 走看看