题意:包含图中所有结点的简单环称为汉密尔顿环。给出无向图,然后给出k个查询,问每个查询是否是汉密尔顿环。
思路:根据题目可知,我们需要判断一下几个条件:(1).首先保证给定的环相邻两结点是连通的;(2).若图结点个数为n,则环的结点个数必须是n+1;(3).环的起点和终点必须相同;(4).除了首尾结点外,其余结点有且仅有出现过一次。
注意点:因为会多次查询,因此记得在每次查询前进行初始化!(这个点经常出错!画时间找这种错误非常浪费!)
代码:
#include <cstdio> #include <cstring> const int maxn=205; int graph[maxn][maxn]={0}; int path[maxn];//存放查询的路径 int cnt[maxn]={0};//存放路径结点出现的次数 int main() {int n,m,u,v; scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); graph[u][v]=graph[v][u]=1; } int query,k; scanf("%d",&query); while(query--){ scanf("%d",&k); bool flag=true; memset(cnt,0,sizeof(cnt));//每次查询前记得初始化!!!!! for(int i=0;i<k;i++){ scanf("%d",&path[i]); cnt[path[i]]++;//统计路径上的结点出现过的次数 } //判断1 if(k!=n+1 || path[0]!=path[k-1]) flag=false; else{ //判断2,环是否连通 int pre=path[0]; for(int i=1;i<k;i++){ if(graph[pre][path[i]]==0){ flag=false; break; } pre=path[i]; } if(flag){ //判断3 for(int i=1;i<k-1;i++){ if(cnt[path[i]]>1){ flag=false; break; } } } } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }