题目描述
题目大意
判定给定路径是不是哈密顿路径,即由图中所有顶点构成的简单回路(不能有重复顶点,除了起点终点相同)
闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径(Hamiltonian path)。
解析
开始把题目想复杂了,想通过DFS求出所有的哈密顿路径…其实只需要判断输入路径点与点之间是否连通,是否有重复回路即可。
易错点:由于我采用的是在线处理,注意不要不满足条件就直接不管当前路径直接跳到下一条路径的判断,这样当前路径中还未输入的顶点在缓冲区中会干扰其他输入>_<
为了避免出错还是不要用在线处理的好。
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
int G[205][205];
bool vis[205];
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n, k; cin >> n >> k;
while (k--) {
int c1, c2; scanf("%d %d", &c1, &c2);
G[c1][c2] = G[c2][c1] = 1;
}
cin >> k;
while (k--) {
int m; cin >> m;
if (m == n + 1) {
memset(vis, 0, sizeof(vis));
int flag = 1;
int s,u; cin >> s;
u = s;
for (int i = 1; i < m; i++) {
int v; scanf("%d", &v);
if (G[u][v] == 0||vis[v]==1||i==m-1&&v!=s) {
flag = 0;
}
vis[v] = 1; u = v;
}
if (flag) cout << "YES\n";
else cout << "NO\n";
}
else {
while (m--) { //容易忘记吸收后面的字符
int t; scanf("%d", &t);
}
cout << "NO\n";
}
}
return 0;
}