zoukankan      html  css  js  c++  java
  • ZOJ4127 Grid with Arrows(欧拉路径的判断)

    对于本题,本质上是哈密顿回路,但是由于特殊性,每个点仅有一条往外的连边

    因此,本题等价于欧拉路径的判断,只需要根据欧拉路径判断答案即可

    即连通性和出度入度间的关系

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=500005;
    const int inf=0x3f3f3f3f;
    int p[N];
    int n,m;
    vector<char> g[N];
    int in[N],out[N];
    int num;
    int find(int x){
        if(p[x]!=x){
            p[x]=find(p[x]);
        }
        return p[x];
    }
    int main(){
        int t;
        ios::sync_with_stdio(false);
        cin>>t;
        while(t--){
            cin>>n>>m;
            int i,j;
            num=0;
            for(i=0;i<n*m;i++){
                p[i]=i;
                g[i].clear();
                in[i]=out[i]=0;
            }
            for(i=0;i<n;i++){
                for(j=0;j<m;j++){
                    char c;
                    cin>>c;
                    g[i].push_back(c);
                }
            }
            for(i=0;i<n;i++){
                for(j=0;j<m;j++){
                    int x;
                    cin>>x;
                    int dx,dy;
                    if(g[i][j]=='u'){
                        dx=i-x;
                        dy=j;
                    }
                    else if(g[i][j]=='d'){
                        dx=i+x;
                        dy=j;
                    }
                    else if(g[i][j]=='r'){
                        dx=i;
                        dy=j+x;
                    }
                    else{
                        dx=i;
                        dy=j-x;
                    }
                    if(dx<0||dx>=n||dy<0||dy>=m)
                        continue;
                    int tmp1=dx*m+dy;
                    int tmp2=i*m+j;
                    int pa=find(tmp1);
                    int pb=find(tmp2);
                    in[tmp1]++,out[tmp2]++;
                    if(pa!=pb){
                        p[pa]=pb;
                        num++;
                    }
                }
            }
            int sig1=0;
            int sig2=0;
            for(i=0;i<n*m;i++)
                if(in[i]>out[i]) sig1+= in[i]-out[i];
                else sig2 += out[i]-in[i];
            if(num==n*m-1&&sig1<=1&&sig2<=1)cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    小程序支付
    小程序传参
    git
    学习过程遇到问题的解决方法
    进程创建注意事项:函数及对应包
    进程创建:函数及对应包
    mac解决eclipse 端口占用问题
    暴力
    doc2vec
    Java正则表达式的解释说明
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13778885.html
Copyright © 2011-2022 走看看