PAT A1122 Hamiltonian Cycle
- 题目要求的这种cycle是一个经过了所有顶点的简单环路,应该可以理解为序列应包含N+1个元素,首尾元素相同,其余的元素只出现一次,且整条路线是能走通的
- 手抽用了vector作visited数组,每次判断一个序列都需要初始化,用以前的fill方式报编译错误,用resize好像跑到了奇怪的地方,无奈只好用for循环初始化。。。原因尚未研究
- 后记:resize只会根据大小增删原vector的元素,如果是增,则按照指定的值,没指定则按照元素类型的初始化。所以resize并不会改变之前赋过的值
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int> > vv;
vector<bool> visited;
int main(){
int N,M;
cin >> N >> M;
vv.resize(N + 1,vector<int>(N + 1));
visited.resize(N + 1);
for(int i = 0;i < M;i ++){
int a,b;
cin >> a >> b;
vv[a][b] = vv[b][a] = 1;
}
int K;
cin >> K;
for(int i = 0;i < K;i ++){
int num;
cin >> num;
for(int j = 0;j < visited.size();j ++) visited[j] = false;
vector<int> vtmp(num);
for(int j = 0;j < num;j ++) cin >> vtmp[j];
if(num != N + 1 || vtmp[0] != vtmp[vtmp.size() - 1]){
cout << "NO\n";
continue;
}
int j = 0;
for(;j < vtmp.size() - 1;j ++){
if(vv[vtmp[j]][vtmp[j + 1]] != 1 || visited[vtmp[j]]) break;
visited[vtmp[j]] = true;
}
if(j == vtmp.size() - 1) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}