yooocen / dadaLearningBlogs

入职之后所有的学习文档
0 stars 0 forks source link

不务正业系列之pat解题:1122. Hamiltonian Cycle (25) #13

Open yooocen opened 6 years ago

yooocen commented 6 years ago

不说了,坑点都标出来了,什么段错误啊,什么判断除0以后的数字不可重复,再判断首尾不想等

//
//  Hamiltonian.cpp
//  test
//
//  Created by 陈涌达 on 2018/4/7.
//  Copyright © 2018年 陈涌达. All rights reserved.
//

#include <cstdio>
#include <algorithm>
using namespace std;
const int MX=220;
int Graph[MX][MX] = {0};
int n , m;

bool isHamiltonian(int length){
    bool flag = false;
    //长度不能超过n+1
    if(length!=n+1){
        flag = true;
    }
    //不要用length,会有段错误
    int array[MX] ={0};
    int cnt[MX] ={0};
    for(int k = 0 ; k < length; k++){
        scanf("%d",&array[k]);
        //除了首尾之外的地方不可以重复
        if(cnt[array[k]]==0 && k!=0 /*&& k!=length-1*/){
            cnt[array[k]] =1;
        }else if(cnt[array[k]]==1 && k!=0 /*&& k!=length-1*/){
            flag = true;
        }
        if(k!=0 && Graph[array[k-1]][array[k]]!=0){
            continue;
        }else if(k==0){
            continue;
        }else{
            flag = true;
        }

    }

    if(array[0]!=array[length-1]  ){
        flag = true;
    }
    //不能这么写的
//    if(cnt[0]==1){
//        flag = true;
//    }
    return flag;
}

int main()
{

    scanf("%d %d",&n,&m);
    for(int i = 0 ; i<m;i++){
        int from , to;
        scanf("%d %d",&from ,&to);
        Graph[from][to] = Graph[to][from] =1;
    }
    int query = 0;
    scanf("%d",&query);
    int k;
    for(int i = 0 ; i <query;i++){

        scanf("%d", &k);
        bool flag = isHamiltonian(k);
        if(flag){
            printf("NO\n");
        }else{
            printf("YES\n");
        }
    }
    return 0;
}