http://www.lydsy.com/JudgeOnline/problem.php?id=4727

竞赛图tarjan缩点后得到的拓扑图一定是一条链

因为竞赛图任意两点的前后顺序确定,只有一种拓扑序列

竞赛图tarjan缩完点后,若出现强联通分量A和B

那么A中所有点 和 B中所有点的连边 要么全指向A中所有点,要么全指向B中所有点

否则A和B就是一个强联通分量

所以把缩完点之后按点的入度从小到大排序,即可得到竞赛图的拓扑序列

在这个拓扑序列上,可以从前面的强联通分量中任意一个点出来,到达后面的强联通分量的任意一个点

因为竞赛图的任意强联通子图存在一条哈密顿回路

那么再求出每个强联通分量的哈密顿回路

枚举起点,先把起点所在的哈密顿回路扔进栈,然后再按拓扑序把后面的哈密顿回路扔进栈,输出即可

如何在竞赛图哈密顿路径的基础上构造回路,详请参见博客http://www.cnblogs.com/TheRoadToTheGold/p/8439160.html

#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm> using namespace std; #define N 2001 int n;
bool mp[N][N]; int tot;
int dfn[N],low[N];
int st[N],top;
bool vis[N]; int cnt;
int id[N];
vector<int>scc[N]; int nxt[N]; int pos[N],in[N]; template<typename T>
void read(T &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void tarjan(int x)
{
dfn[x]=low[x]=++tot;
st[++top]=x;
vis[x]=true;
for(int i=;i<=n;++i)
{
if(!mp[x][i]) continue;
if(!dfn[i])
{
tarjan(i);
low[x]=min(low[x],low[i]);
}
else if(vis[i]) low[x]=min(low[x],dfn[i]);
}
if(low[x]==dfn[x])
{
cnt++;
while(st[top]!=x)
{
scc[cnt].push_back(st[top]);
id[st[top]]=cnt;
vis[st[top--]]=false;
}
scc[cnt].push_back(x);
id[x]=cnt;
vis[x]=false;
top--;
}
} bool cmp(int a,int b)
{
return in[a]<in[b];
} void insert(int x)
{
st[++top]=x;
for(int i=nxt[x];i && i!=x;i=nxt[i]) st[++top]=i;
} int main()
{
read(n);
for(int i=;i<n;++i)
for(int j=;j<=i;++j)
{
read(mp[j][i+]);
mp[i+][j]=mp[j][i+]^;
}
for(int i=;i<=n;++i)
if(!dfn[i]) tarjan(i);
for(int now=;now<=cnt;++now)
{
int siz=scc[now].size();
int l,r;
l=r=scc[now][];
for(int i=,t;i<siz;++i)
{
t=scc[now][i];
if(mp[t][l]) nxt[t]=l,l=t;
else if(mp[r][t]) nxt[r]=t,r=t;
else
{
for(int j=l;j;j=nxt[j])
if(mp[j][t] &&mp[t][nxt[j]])
{
nxt[t]=nxt[j]; nxt[j]=t;
break;
}
}
}
r=;
for(int i=nxt[l];i;i=nxt[i])
if(r)
{
for(int j=r,k=l;;k=j,j=nxt[j])
{
if(mp[i][j])
{
nxt[k]=nxt[l];
if(k!=l) nxt[l]=r;
l=i; r=j;
break;
}
if(j==l) break;
}
}
else if(mp[i][l]) r=l,l=i;
nxt[l]=r;
}
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
if(id[i]!=id[j] && mp[i][j])
in[id[j]]++;
for(int i=;i<=cnt;++i)
{
pos[i]=i;
in[i]/=scc[i].size();
}
sort(pos+,pos+cnt+,cmp);
for(int i=;i<=n;++i)
{
top=; insert(i);
for(int j=,t;j<=cnt;++j)
if(in[t=pos[j]]>in[id[i]])
insert(scc[t][]);
printf("%d ",top);
for(int j=;j<=top;++j)
{
printf("%d",st[j]);
putchar(j==top ? '\n' : ' ');
}
}
}

bzoj千题计划232:bzoj4727: [POI2017]Turysta的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. 起步 - vue-router路由与页面间导航

    vue-router 我们知道路由定义了一系列访问的地址规则,路由引擎根据这些规则匹配找到对应的处理页面,然后将请求转发给页进行处理.可以说所有的后端开发都是这样做的,而前端路由是不存在"请 ...

  2. fiddler之会话数据的修改

    fiddler之会话数据的修改 fiddler记录http的请求,并且针对特定的http请求,可以分析请求数据.修改数据.调试web系统等,功能十分强大.本篇主要讲两种修改的数据的方法,断点和Unlo ...

  3. Laya鼠标事件阅读

    点击事件核心类:MouseManager和TouchManager. MouseManager负责收集相关事件,进行捕获阶段和目标阶段. TouchManger负责处理和分发事件,进行冒泡阶段. 捕获 ...

  4. 我的小游戏上线海外AppStore完整流程心得

    1,购买一台Mac或者用VMWare 安装Mac OS流程,笔者使用VMWare. 先安装Mac OS 10.13,教程,成功后不要着急安装vmtools, 首先更新系统至最新版,因为真机测试往往需要 ...

  5. LintCode——全排列

    描述:给定一个数字列表,返回其所有可能的排列. 样例:给出一个列表[1,2,3],其全排列为:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 说明: ...

  6. 说说 Python 的变量以及简单数据类型

    1 变量 先来看一个示例: news="我国第一个人工智能规划问世"print(news) 运行结果: 可以看出使用 Python 定义变量很简单,甚至都不需要指定变量的类型. 1 ...

  7. No.1101_第十次团队会议

    今天项目进展很多,大家都在现在的成果而开心,信心高涨,后面的任务的完成也基本都能指日可待.之前团队出现了各种问题,沟通出现了很多障碍,导致各方面受阻.现在大家再面对面坦诚相对,交流了一下自己的想法,结 ...

  8. Linux内核分析 计算机是如何工作的——by王玥

    1.冯诺依曼体系结构:也就是指存储程序计算机 硬件(存储程序计算机工作模式): 软件(程序员角度): 2.API:程序员与计算机的接口界面 ABI:程序与CPU的接口界面 3.X86的实现: 4.X8 ...

  9. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  10. Beta版本冲刺(五)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...