打比赛的时候sb了,用了一个似乎原本可以不用的东西来找环。。。

首先,根据题意,我们可以连成一张图,而蛇能不能回到自己的家, 只需要在一个环上就行了。

问题是怎么找环,我用了 Tarjan。。。

具体做法是每个强连通的大小如果不为 \(1\),就把这个强连通的大小计入答案。

还有就是记得清空。

code:

#include<cstdio>
const int M=3e5+5;
struct Edge{
int to;Edge*nx;
}e[M<<1],*h[M],*cnt=e;
int n,ans,dfc,top,is[M],stk[M],low[M],dfn[M];
inline void Add(const int&u,const int&v){
*cnt=(Edge){v,h[u]};h[u]=cnt++;
}
inline int min(const int&a,const int&b){
return a>b?b:a;
}
void Tarjan(int u){
is[stk[++top]=u]=true;
low[u]=dfn[u]=++dfc;
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(is[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int v,siz=0;
do is[v=stk[top--]]=0,++siz; while(v!=u);
if(siz>1)ans+=siz;
}
}
signed main(){
int T,i;char s;
scanf("%d",&T);
while(T--){
scanf("%d",&n);getchar();
for(i=1;i<=n;++i){
h[i]=NULL;
low[i]=dfn[i]=0;
}
top=dfc=ans=0;
for(i=1;i<=n;++i){
s=getchar();
if(s=='<')Add(i%n+1,i);
else if(s=='>')Add(i,i%n+1);
else Add(i,i%n+1),Add(i%n+1,i);
}
getchar();
for(i=1;i<=n;++i)if(!dfn[i])Tarjan(i);
printf("%d\n",ans);
}
}

最新文章

  1. 【noip 2005】 采药
  2. mac在终端下中用sublime text 2 打开文件
  3. 非递归创建二叉树( C++队列 )
  4. VC++ 6.0远程调试配置
  5. 删除顽固node_modules
  6. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存
  7. CentOS 6.6 配置PuTTY远程登录
  8. 一、HTTPServer,RequestHandler,ServerHandler,Handler
  9. CrossApp 0.3.1示例编译问题解决过程
  10. jQuery Mobile 1.1八大新特性介绍
  11. HTTP 417解决方案
  12. 利用jquery操作Radio方法小结
  13. 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例
  14. 从0.5开始学Java 零
  15. BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
  16. C# 发展史
  17. 多线程(Thread,Runnable)
  18. python3用BeautifulSoup抓取图片地址
  19. Mac OS使用技巧十九:Safari碉堡功能之二查看网页源代码
  20. 通过mysqltools全自动安装配置mysql复制环境

热门文章

  1. 搭建golang开发环境(1.14之后版本)
  2. ybt的坑
  3. 如何对Spring MVC中的Controller进行单元测试
  4. 基于XC7A100T的PCIe千兆电口以太网收发卡
  5. Unreal ListView使用篇
  6. 花里胡哨之自定义linux终端前缀显示
  7. mysq数据库相信介绍大纲!!!!!!
  8. [LeetCode]1342. 将数字变成 0 的操作次数
  9. [Golang]一些书城项目中出现错误的原因和解决办法(一)
  10. 手把手教你如何通过CC2531抓取Zigbee包,并解析加密Zigbee包