NYOJ 一笔画问题(DFS+欧拉回路)

1
2
思路:笔者第一次做一笔画问题,先用的DFS+回溯,结果样例能出来。但OJ显示错误。后来查了一下发现是欧拉回路的问题。需要回顾以前离散数学学的欧拉回路了。。。。
此处欧拉通路(对于无向图)需要判断:
①(入度||出度)为奇数的顶点的个数为0||2。
②图是连通的。
原因:奇度顶点在连通图中相当于起点或者终点,所以个数只能是0个(起点即终点)或者两个(一个起点一个终点)
以下三种情况中奇度顶点个数的栗子。
4

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
vector<int> a[1001];
bool vis[1001],flag;
int P,count;
int judge(){
    int tmp = 0;
    for(int i=1;i<=P;i++){
        int cnt = a[i].size();
        if(cnt%2!=0) tmp++;
    }
    return tmp;
}
void dfs(int cur){
    if(count==P){
        flag = true;
        return;
    }else
        for(int i=0;i<a[cur].size();i++)
            if(!vis[a[cur][i]]){
                vis[a[cur][i]] = true;
                count++;
                dfs(a[cur][i]);
                if(flag) return;
            }
}
int main(){
    int N,Q,A,B;
    cin>>N;
    while(N--){
        cin>>P>>Q;
        memset(a,0,sizeof(a));
        memset(vis,false,sizeof(vis));
        while(Q--){
            cin>>A>>B;
            a[A].push_back(B);
            a[B].push_back(A);
        }
        int jiShu = judge();
        if(jiShu==0||jiShu==2){
            vis[1] = true;
            count = 1;
            flag = false;
            dfs(1);
            if(flag)
                cout<<"Yes"<<endl;
            else 
                cout<<"No"<<endl;
        }else cout<<"No"<<endl;
    }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/sl_world/article/details/79729566
今日推荐