求一个简单环。开始为了归一化,把最后一个节点丢了,以为首尾一样就好。然后发现有图没有环的情况,然后会出错。注意这点就好。
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#define MAX 210
using namespace std;
vector <int> g[MAX];
int vertex, edge;
int n;
bool isVis[MAX];
bool DFS(vector <int> list) {
memset(isVis, false, sizeof(isVis));
isVis[list[0]] = true;
int pre = list[0];
bool isFind = false;
bool isLink = true;
if (list[0] == list[list.size() - 1]) {//首尾相同可能是个环
for (int i = 1; i < list.size(); i++) { //是否连通
for (int j = 0; j < g[pre].size(); j++) {//查找list[i]
if (((!isVis[list[i]]) || (isVis[list[i]] && i==list.size()-1)) && g[pre][j] == list[i]) {
//case1:
//当图本身没有环的时候
//需要判定最后一个连回去的边是否能够回去形成环
isVis[list[i]] = true, pre = list[i], isFind = true;
break;
}
}
if (!isFind) { //不联通
isLink = false;
}
else
isFind = false;
}
}
else
isLink = false;
for (int i = 0; i < list.size(); i++) {//是否包含整个节点
if (!isVis[list[i]]) {
isLink = false;
break;
}
}
return isLink;
}
int main() {
cin >> vertex >> edge;
int u, v;
for (int i = 0; i < edge; i++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
vector <int> tempv;
int tempn;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> tempn;
tempv.clear();
int tempint;
for (int j = 0; j < tempn; j++) {
cin >> tempint;
tempv.push_back(tempint);
}
if(tempn == vertex + 1) {
bool isCir = DFS(tempv);
if (isCir) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
}
else {
cout << "NO" << endl;
}
}
return 0;
}