哈密顿通路: 通过图中每个点且只通过一次,并且经过每一顶点的通路。
哈密顿回路: 通过图中每个点且只通过一次,并且经过每一顶点的回路。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 300+5;
int G[MAXN][MAXN], N, M, K, k, v[MAXN];
set<int> vis;
bool judge(){
if(v[1] != v[k] || k-1 != N || vis.size() != N) //vis==N且k-1==N说明所有节点均访问且仅访问一次
return false;
for(int i = 1; i < k; ++i)
if(!G[v[i]][v[i+1]])
return false;
return true;
}
int main() {
int a, b;
cin >> N >> M;
while(M--){
cin >> a >> b;
G[a][b] = G[b][a] = 1;
}
cin >> K;
while(K--){
cin >> k;
vis.clear();
for(int i = 1; i <= k; ++i){
cin >> v[i];
vis.insert(v[i]);
}
if(judge())
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}
判定方法:
包含个顶点的图, 如果任意两个顶点的度数之和都不小于n-1(即大于等于n-1), 则存在哈密尔顿通路。
包含个顶点的图, 如果任意两个顶点的度数之和都不小于n(即大于等于n), 则存在哈密尔顿回路。