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. 转--看完让你彻底搞懂Websocket原理

    偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有.所以转到我博客里,分享一下.比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗 ...

  2. 在Windows上安装配置Git

    用安装 https://git-scm.com/ 官网下载安装包 (官网有安装步骤 https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%8 ...

  3. Revit二次开发-根据视图阶段(Phase)创建房间

    最近开发业务中,有一个自动创建房间的功能,很自然的想到了Document.NewRooms2方法.但是当前功能的特殊之处在于,Revit项目视图是分阶段(Phase)的,不同阶段的房间是互相独立的. ...

  4. LeetCode-37.解数独

    编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...

  5. 第二阶段冲刺——four

    个人任务: 季方:实现团队博客作业查询. 王金萱:优化统计团队博客结果界面的显示. 马佳慧:选择功能界面的背景设计. 司宇航:用servlet完成名单打印功能. 站立会议: 任务看板和燃尽图:

  6. oracle (+) 什么意思

    oracle中的(+)是一种特殊的用法,(+)表示外连接,并且总是放在非主表的一方. 例如左外连接:select A.a,B.a from A LEFT JOIN B ON A.b=B.b;等价于se ...

  7. SE Springer小组《Spring音乐播放器》软件需求说明之四

    4 运行环境规定 4.1设备 我们计划完成的音乐软件较小巧,功能并不复杂,在普通笔记本电脑中即可运行,并无特殊硬设备要求. 4.2支持软件 需要用到windows操作系统,用VS编写C/C++代码,还 ...

  8. 第二个Sprint冲刺第三天(燃尽图)

  9. d3 选择器

    一.隔了一段时间没看D3了,好多api又陌生了.武林太大,唯有自强不息. D3 选择器算是学习D3的第一步吧. 跟 学习JQ一样.先熟悉下api,才能够如鱼得水,手到勤来. 二. 选择器 1.选择器 ...

  10. 使用kubeadm 离线安装 单master k8s 1.13

    Study From :https://www.kubernetes.org.cn/4948.html https://www.kubernetes.org.cn/4948.html 感谢原作者提供的 ...