#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<int> adj[51];
int visited[51];
bool flag;
void dfs(int i,int parent){
vector<int>::iterator it;
for(it = adj[i].begin();it!=adj[i].end();it++){
if(!visited[*it]){
visited[*it]=1;
dfs(*it,i); // passing parent element
}
if(visited[*it] && (*it !=parent )){
flag=true; return;
}
}
}
int main(){
int a,b;
cin>>n>>m;
for(int i=0;i<m;i++){ // graph ready.
cin>>a>>b;
if(a==b){
cout<<"YES"; return 0;
}
adj[a].push_back(b);
adj[b].push_back(a);
}
for(int i=1;i<=n;i++){
std::vector<int>::iterator it;
for(it=adj[i].begin();it!=adj[i].end();it++){
if(!visited[*it]){
visited[*it]=1;
dfs(*it,-1);
}
}
}
if(flag){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
任何人都可以查看我的代码并告诉我我在这里缺少哪个测试用例。 hackerearth只得到60/100。我在这里使用父变量来跟踪被认为是循环的单个边缘。
答案 0 :(得分:0)
您输出错误,因为在adjacency list
中,每个边都列出两次。
所以说我们的图表包含3 vertices
和2 edges
:
1------2------3
显然,没有循环。但您的代码也会为此输入返回 YES 。原因是一旦特定顶点i
由于其父j
而被访问,下次调用dfs
i
时,顶点j
将会出现要访问,因此,输出是,这是错误的。
<强> FIX 强>
每当我们访问已经访问过的顶点i
时,我们都不会立即声明我们已经找到了一个循环,我们必须确保顶点i
不是顶点的父节点我们打电话给dfs,只有这样你才能得到正确答案。
一旦你理解了出错的地方,代码就会更容易编写。