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. rabbitMQ教程(三)一篇文章看懂rabbitMQ

    一.rabbitMQ是什么: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. 学过websocket的来理解rabbitMQ应该是 ...

  2. git 创建标签和删除标签

    创建标签 在Git中打标签非常简单,首先,切换到需要打标签的分支上: $ git branch * dev master $ git checkout master Switched to branc ...

  3. MAC下搭建Hexo博客

    一.前言 Hexo是一款快速.简洁,基于node.js的强力框架. (1)超快速度:Node.js 所带来的超快生成速度,让上百个页面在几秒内瞬间完成渲染. (2)支持markdown:Hexo 支持 ...

  4. 互联网寒冬,Python 程序员如何准备面试

    虽说年年都在喊互联网寒冬,最难就业季,但是今年确实有点不一样,年前年后一波又一波互联网公司宣布『人员调整,结构优化』, 这是往年没发生过的. 是不是面试机会就少了很多呢?不是的. 搜索招聘网站我们可以 ...

  5. 关于Backbone和Underscore再说几点

    1. Backbone本身没有DOM操作功能,所以我们需要导入JQuery/Zepto/Ender 2. Backbone依赖于underscore.js: http://documentcloud. ...

  6. 20135202闫佳歆--week4 两种方式使用同一个系统调用--实验及总结

    实验四 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 在这里我选择的是第20号系统调用,getpid. 1.使用库函数API: 代码如下: /* getpid.c */ #incl ...

  7. Linux内核分析作业四

    扒开系统调用的三层皮 一.用户态.内核态和中断 一般现代CPU都有几种不同的指令级别 在高级别执行级别下,代码可以执行特权指令,访问任意的物理地址,称之为内核态 在相应的低指令执行级别下,代码的掌控范 ...

  8. JAVA面对对象(二)——继承、方法的覆写

    1.继承就是基于已存在的类构造一个新类,继承已存在的类就能复用类的方法和属性,并且能够添加新的方法和属性.也就是子类和父类 2.一个父类可以拥有多个子类,一个子类只允许有一个父类 3.用extends ...

  9. React组件继承的由来

    没有显式继承的时候我们这么写: import * as React from "react"; export interface HelloProps { compiler: st ...

  10. Linux命令(十九) 查看系统负载 uptime

    一.命令介绍 Linux 系统中 uptime 命令主要用于获取主机运行时长和查询Linux系统负载等信息. uptime 命令可以显示系统已经运行了多长时间,信息显示依次为:现在时间.系统已经运行时 ...