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
没有人不辛苦,只有人不喊疼
原文地址:https://www.cnblogs.com/ctyakwf/p/13778885.html