您的位置:首页 > 其它

PAT A1122 hamiltonian cycle (25)

2017-03-03 12:45 260 查看
//哈密顿环路,能够沿边形成一个覆盖所有点的环路,中间点不重复。判断:1、k=n+1 2、数组首尾相同才能形成环路 3、每个点出现1次 4、必须有边才能走
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX=210;
int G[MAX][MAX]={0};

int judge(vector<int> vn){
int vis[MAX]={0};
int i;
if(vn[0]!=vn[vn.size()-1]) return 0;//not a cycle
for(i=1;i<vn.size();i++){
if(G[vn[i-1]][vn[i]]==1){//if has an edge
vis[vn[i]]++;
if(vis[vn[i]]>1) return 0;
}else return 0;//not a edge
}
return 1;
}
int main(){
int n,m,i;
scanf("%d%d",&n,&m);
int v1,v2;
for(i=0;i<m;i++){
scanf("%d%d",&v1,&v2);
G[v1][v2]=G[v2][v1]=1;
}

int k,temp,query;
scanf("%d",&query);
for(i=0;i<query;i++){
scanf("%d",&k);
vector<int> vn;
for(int j=0;j<k;j++){
scanf("%d",&temp);
vn.push_back(temp);
}
if(k==(n+1)){
if(judge(vn)==1) printf("YES\n");
else printf("NO\n");
}else printf("NO\n");
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: