NO
題意就是輸入一個(gè)圖 然后在輸入多行數(shù)據(jù) 每一行表示一個(gè)軌跡 需要分析這個(gè)軌跡是否構(gòu)成哈密頓回路
哈密頓回路就是一條能夠串聯(lián)起圖中所有點(diǎn)的回路 如何判斷呢 一開始想復(fù)雜了 以為這個(gè)行序列里有多條起點(diǎn)和終點(diǎn) 需要把每一段起點(diǎn)終點(diǎn)相同的點(diǎn)有可能構(gòu)成回路的線段都存到向量里 最后交了一發(fā)發(fā)現(xiàn)其實(shí)并沒有這么復(fù)雜 只需判斷這個(gè)行序列是不是第一個(gè)數(shù)等于最后一個(gè)數(shù) 并且這之間遍歷了所有的點(diǎn) 那么就符合YES條件 否則輸出NO
另外 一定要判斷這條軌跡中彼此連邊是否存在 不然還讓你輸入那么多邊干嘛?
AC code:
#include<set>#include<map>#include<vector>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct node{ int s,e; };int a[210][210];int tre[210];int last[210];int main(){ vector<node>v; int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int s,e; scanf("%d%d",&s,&e); a[s][e]=1; a[e][s]=1; } int k; scanf("%d",&k); while(k--) { int t; scanf("%d",&t); for(int i=1;i<=t;i++)scanf("%d",&tre[i]); bool ver[210]={0}; int check=n; bool flag=0; for(int i=1;i<=t;i++) { if(i>1&&a[tre[i-1]][tre[i]]!=1)break; if(!ver[tre[i]]) { check--; ver[tre[i]]=1; } else if(ver[tre[i]]&&check)break; else if(check==0&&ver[tre[i]]&&tre[1]==tre[t]&&i==t) { flag=1; break; } } if(flag)printf("YES/n"); else printf("NO/n"); } return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選