之前好像做过类似的
#include<iostream>
#include<vector>
#include<set>
using namespace std;
vector<int> path;
int a[209][209]={0};
bool cflag=true;
void dfs(vector<int>path1)
{//end 判断这个部分图是否连通
for(int i=1;i<path1.size();i++)
{ if(a[path1[i-1]][path[i]]==0)
cflag=false;
}
}
int main()
{int n,m,ll,rr,tempk,kk;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>ll>>rr;
a[ll][rr]=a[rr][ll]=1;
}
cin>>tempk;
for(int i=0;i<tempk;i++)
{ cin>>kk;
cflag=true;
set<int>sett;
path.clear();
path.resize(kk);
for(int j=0;j<kk;j++)
{
scanf("%d",&path[j]);
sett.insert(path[j]);
}
dfs(path);
if(path[0]!=path[kk-1]||cflag==false) printf("NO\n");//begin end 到底指向啥
else if(sett.size()!=n) printf("NO\n");
else if(kk!=n+1) printf("NO\n");//简单的图包含每个顶点形成环其中只能一共有n+1个点
else printf("YES\n");
}
return 0;
}
总结
1、注意简单环包含每个顶点,且不重复只能是n+1个顶点
2.vector的 end()指向的不是最后一个元素,是最后一个元素的下一个位置,所以若取最后一个元素不能用c.end()
英语
问题
无