pat-1122

之前好像做过类似的 

#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()

英语

问题

猜你喜欢

转载自blog.csdn.net/m0_45359314/article/details/112834909