解题思路:采用邻接矩阵存储
1、先确定输入数据的个数是否等于顶点数+1
2、访问完每个顶点后标记
3、判断首尾顶点是否一致
#include <stdio.h> #include <string.h> #define MaxVex 210 int G[MaxVex][MaxVex]; int visit[MaxVex]= {0}; int a[MaxVex]= {0}; int Nv,Ne; void Init() {//图初始化 scanf("%d %d",&Nv,&Ne); int v1,v2; memset(G,0,sizeof(G)); int i; for(i=0; i<Ne; i++) { scanf("%d %d",&v1,&v2); G[v1][v2]=1; G[v2][v1]=G[v1][v2]; } } int Judge(int a[],int m) { int i; if(m==Nv+1) {//输入结点数==顶点数+1 for(i=1; i<m; i++) { if(!visit[a[i]]&&G[a[i]][a[i+1]])//遍历访问 visit[a[i]]=1;//标记访问 else return 0; } if(i==m&&a[i]==a[1]) {//判断首尾是否相同 return 1; } } return 0; } int main() { Init(); int m; scanf("%d",&m); int i,j; for(i=0; i<m; i++) { int k; scanf("%d",&k); memset(a,0,sizeof(a)); memset(visit,0,sizeof(visit)); for(j=1; j<=k; j++) { scanf("%d",&a[j]); } if(Judge(a,k)) printf("YES"); else printf("NO"); printf("\n"); } return 0; }