基础实验6-2.2 汉密尔顿回路 (25分)--邻接矩阵

基础实验6-2.2 汉密尔顿回路 (25分)--邻接矩阵

 

 基础实验6-2.2 汉密尔顿回路 (25分)--邻接矩阵

 

 基础实验6-2.2 汉密尔顿回路 (25分)--邻接矩阵

 

 解题思路:采用邻接矩阵存储

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;
}

 

上一篇:二进制优化多重背包


下一篇:求 n 以内的素数和以及素数个数