您的位置:首页 > 其它

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

2018-03-28 16:40 405 查看




思路:笔者第一次做一笔画问题,先用的DFS+回溯,结果样例能出来。但OJ显示错误。后来查了一下发现是欧拉回路的问题。需要回顾以前离散数学学的欧拉回路了。。。。

此处欧拉通路(对于无向图)需要判断:

①(入度||出度)为奇数的顶点的个数为0||2。

②图是连通的。

原因:奇度顶点在连通图中相当于起点或者终点,所以个数只能是0个(起点即终点)或者两个(一个起点一个终点)

以下三种情况中奇度顶点个数的栗子。



#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
b57c
(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: