bzoj千题计划232:bzoj4727: [POI2017]Turysta
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的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
随机推荐
- Flask_admin 笔记一 (快速启用)
1,快速启用 1) 安装flask-admin pip install flask-admin 2) 配置使用 from flask import Flask from flask_admin i ...
- harbor使用和管理
一.上传本地镜像到harbor中 先在harbor 中创建testdocker 项目 因为我们本地没有镜像,我们先拉取一个镜像,然后进行下面的操作 查看nginx 镜像 2.下载nginx镜像到本地 ...
- 百度地图API的网页使用
请看图示(以及参考官方文档): 图片尺寸:1710x822
- 【大数据实战】将普通文本文件导入ElasticSearch
以<刑法>文本.txt为例. 一.格式化数据 1,首先,ElasticSearch只能接收格式化的数据,所以,我们需要将文本文件转换为格式化的数据---json. 下图为未处理的文本文件. ...
- 微软职位内部推荐-Senior Software Engineer-DUT
微软近期Open的职位: Document Understanding and Task (DUT) team in STCA focuses on semantic understanding an ...
- 1094. The Largest Generation (25)-(dfs,树的遍历,统计每层的节点数)
题目很简单,就是统计一下每层的节点数,输出节点数最多的个数和对应的层数即可. #include <iostream> #include <cstdio> #include &l ...
- SCRUM 12.03
第二轮迭代从今天起正式开始了.12月3日,我们举行了一次组会. 第一轮迭代结束时,我们意识到第二轮迭代需要实现的功能主要如下: 在下次迭代的时候实现对多个网站的信息进行比较取最优惠的选择,目前我们劲针 ...
- 《Linux内核分析》第五周:分析system_call中断处理过程
实验 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/l ...
- 冲刺Two之站立会议4
在完成了对主界面的设计之后,我们对自己的聊天室界面进行了优化,添加了一些标签和图片按钮等组件让界面更加美观一些.然后还查询了一些关于改进视频和音频质量的资料,准备开展相关工作.
- Spherical Hashing,球哈希
1. Introduction 在传统的LSH.SSH.PCA-ITQ等哈希算法中,本质都是利用超平面对数据点进行划分,但是在D维空间中,至少需要D+1个超平面才能形成一个封闭.紧凑的区域.而球哈希方 ...