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

英语

问题

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值