• 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
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    Java String, StringBuffer和StringBuilder实例
    java中字符串的比较
    java中子类继承父类时是否继承构造函数
    Java中抽象类和接口的用法和区别
    与(&)、非(~)、或(|)、异或(^)
    Linux03
    Linux02
    Linux01
    力扣算法题
    算法 栈、队列、二分查找
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13778885.html
Copyright © 2020-2023  润新知