BZOJ4727 [POI2017]Turysta 【竞赛图哈密顿路径/回路】
题目链接
题解
前置芝士
1.竞赛图存在哈密顿路径
2.竞赛图存在哈密顿回路,当且仅当它是强联通的
所以我们将图缩点后,拓扑排序后一定是一条链,且之前的块内的点和之后块内的点的边一定全都由前面指向后面
而每个块都是强联通的,所以我们从起点出发,一定能找到一条路径走完后面所有点
我们只需预处理出每个强联通块内的一条哈密顿回路,就可以求出答案了
现在问题转化成了求竞赛图的哈密顿回路
我们先求出一条哈密顿路径
哈密顿路径
从竞赛图中任意一个点出发向外扩展,维护一个链表
假若扩展到点\(u\)
1.如果\(u\)指向链头或链尾,直接加入链表
2.否则链的中间一定存在相邻两点,使得\(i\)指向\(u\),\(u\)指向\(i + 1\),这时候把\(u\)插入之间即可
哈密顿回路
我们在哈密顿路径的基础上构造哈密顿回路
首先如果存在如图情况,前\(4\)个点构成回路

我们先找到最大的一个这样的回路,然后只需处理后面不在圈内的几个点
对于一个点\(u\),如果存在一条\(u\)指向圈内点的边,那么\(u\)可以插入圈内
否则跳过\(u\),将\(u\)和之后插入圈内的点一起插入圈内
由于图是强联通的,所以最后一定能全部加入
复杂度\(O(n^2)\)
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define LL long long int
#define REP(i,n) for (register int i = 1; i <= (n); i++)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
#define res register
using namespace std;
const int maxn = 2005,maxm = 100005,INF = 0x3f3f3f3f;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
int tmp[20],ti;
inline void write(int x){
ti = 0;
while (x) tmp[++ti] = x % 10,x /= 10;
while (ti) putchar('0' + tmp[ti--]);
}
vector<int> S[maxn];
int n,G[maxn][maxn];
int dfn[maxn],low[maxn],Scc[maxn],st[maxn],top,cnt,scci;
int nxt[maxn],head[maxn],tail[maxn];
int Nxt[maxn],Head[maxn],Tail[maxn];
int g[maxn][maxn],de[maxn],q[maxn],hh,tt;
int tp[maxn],pos[maxn],ans[maxn],ansi,tot;
int c[maxn],ci;
void dfs(int u){
dfn[u] = low[u] = ++cnt;
st[++top] = u;
for (res int to = 1; to <= n; to++){
if (!G[u][to]) continue;
if (!dfn[to]){
dfs(to);
low[u] = min(low[u],low[to]);
}
else if (!Scc[to]) low[u] = min(low[u],dfn[to]);
}
if (low[u] == dfn[u]){
scci++;
do{
Scc[st[top]] = scci;
S[scci].push_back(st[top]);
}while (st[top--] != u);
}
}
void workline(){
int siz;
for (res int p = 1; p <= scci; p++){
siz = S[p].size();
head[p] = tail[p] = S[p][0];
for (res int i = 1; i < siz; i++){
int u = S[p][i];
if (G[u][head[p]]) nxt[u] = head[p],head[p] = u;
else if (G[tail[p]][u]) nxt[tail[p]] = u,tail[p] = u;
else for (res int j = head[p]; j; j = nxt[j])
if (G[j][u] && G[u][nxt[j]]){
nxt[u] = nxt[j]; nxt[j] = u; break;
}
}
}
}
void workcir(){
int p,last;
for (int i = 1; i <= scci; i++){
ci = 0; p = 1;
for (int k = head[i]; k; k = nxt[k]) c[++ci] = k;
for (int k = ci; k; k--)
if (G[c[k]][head[i]]) {p = k; break;}
Head[i] = c[1]; Tail[i] = c[p];
for (int k = 1; k < p; k++) Nxt[c[k]] = c[k + 1];
last = c[p + 1];
for (int k = p + 1; k <= ci; k++){
int u = c[k],flag = false;
for (int j = Nxt[Head[i]],pre = Head[i]; j; j = Nxt[pre = j])
if (G[u][j]){
Nxt[pre] = last;
Nxt[u] = j;
flag = true;
break;
}
if (flag) last = c[k + 1];
else Nxt[u] = c[k + 1];
}
Nxt[Tail[i]] = Head[i];
}
}
void work(){
for (res int i = 1; i <= n; i++){
int u = Scc[i];
for (res int j = 1; j <= n; j++)
if (G[i][j] && Scc[j] != u && !g[u][Scc[j]])
de[Scc[j]]++,g[u][Scc[j]] = 1;
}
for (res int i = 1; i <= scci; i++) if (!de[i]) q[++tt] = i;
int u; hh = 1;
while (hh <= tt){
u = q[hh++]; pos[u] = ++tot; tp[tot] = u;
for (int i = 1; i <= scci; i++) if (g[u][i]){
if (!(--de[i])) q[++tt] = i;
}
}
for (res int u = 1; u <= n; u++){
int s = Scc[u];
ans[ansi = 1] = u;
for (res int i = Nxt[u]; i != u; i = Nxt[i]) ans[++ansi] = i;
for (res int j = pos[s] + 1; j <= scci; j++){
int t = tp[j];
ans[++ansi] = Head[t];
for (res int i = Nxt[Head[t]]; i != Head[t]; i = Nxt[i])
ans[++ansi] = i;
}
write(ansi); putchar(' ');
for (res int i = 1; i <= ansi; i++){
write(ans[i]);
if (i < ansi) putchar(' ');
}
puts("");
}
}
int main(){
n = read();
for (res int i = 2; i <= n; i++)
for (res int j = 1; j < i; j++)
G[i][j] = ((G[j][i] = read()) ^ 1);
REP(i,n) if (!dfn[i]) dfs(i);
workline();
//puts("LXT");
workcir();
//puts("LXT");
work();
return 0;
}
BZOJ4727 [POI2017]Turysta 【竞赛图哈密顿路径/回路】的更多相关文章
- bzoj千题计划232:bzoj4727: [POI2017]Turysta
http://www.lydsy.com/JudgeOnline/problem.php?id=4727 竞赛图tarjan缩点后得到的拓扑图一定是一条链 因为竞赛图任意两点的前后顺序确定,只有一种拓 ...
- BZOJ4727 [POI2017]Turysta
这题太神了还是去看刺儿神题解吧. http://www.cnblogs.com/neighthorn/p/6538364.html #include <cstdio> #include & ...
- BZOJ 4727: [POI2017]Turysta
4727: [POI2017]Turysta Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 117 Solved ...
- BZOJ.4727.[POI2017]Turysta(哈密顿路径/回路 竞赛图)
题目链接 \(Description\) 给出一个n个点的有向图,任意两个点之间有且仅一条有向边.对于每个点v,求出从v出发的一条经过点数最多,且没有重复经过同一个点一次以上的简单路径. n<= ...
- HDU3414 Tour Route(竞赛图寻找哈密顿回路)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3414 本文链接:http://www.cnblogs.com/Ash-ly/p/5459540.html ...
- 图论 竞赛图(tournament)学习笔记
竞赛图(tournament)学习笔记 现在只是知道几个简单的性质... 竞赛图也叫有向完全图. 其实就是无向完全图的边有了方向. 有一个很有趣的性质就是:一个tournament要么没有环,如果 ...
- POJ1776(哈密顿路径)
题目: http://poj.org/problem?id=1776 题意: 给出一个n*n的矩阵,若第i个任务做完之后可以做第j个任务,则矩阵的第i行第j列为1,否则为0.机器完成一项任务之后会自动 ...
- BZOJ 4726: [POI2017]Sabota?
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 301 Solved ...
- 玩转SQL Server复制回路の变更数据类型、未分区表转为分区表
玩转SQL Server复制回路の变更数据类型.未分区表转为分区表 复制的应用: 初级应用:读写分离.数据库备份 高级应用:搬迁大型数据库(跨机房).变更数据类型.未分区表转为分区表 京东的复制专家 ...
随机推荐
- 我用Python远程探查室友的网页浏览记录,他不愧是成年人!
过程: 利用Python制作远程查看别人电脑的操作记录,与其它教程类似,都是通过邮件返回. 利用程序得到目标电脑浏览器当中的访问记录,生产一个文本并发送到你自己的邮箱,当然这个整个过程除了你把pyth ...
- jsp内置对象 转发与重定向的区别
jsp 内置对象 转发与重定向的比较 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程. 与之相反,重 ...
- linux go环境安装
方法一 这次将源码包安装的目录是是/root下. 1.官网下载源码包. 官网链接:https://golang.org/dl/ wget https://storage.googleapis.co ...
- wf4 FlowChart 理解
1. 工作流是异步的,所以需要信号. 2. 需要创建 NativeActivity<T> 与整个FlowChart交互. 它的返回值 Result 正确含义是 该 Activity处理之后 ...
- (第九周)Beta-1阶段成员贡献分
项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...
- 线程局部存储TLS(thread local storage)
同一全局变量或者静态变量每个线程访问的是同一变量,多个线程同时访存同一全局变量或者静态变量时会导致冲突,尤其是多个线程同时需要修改这一变量时,通过TLS机制,为每一个使用该全局变量的线程都提供一个变量 ...
- Beat(2/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(2/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 做了点商家数据表格 接下来的计划 做 ...
- OSI协议和TCP/IP协议笔记
1.OSI协议: 第7层应用层:OSI中的最高层.是用户与网络的接口.该层通过应用程序来完成网络用户的应用需求,如文件传输.收发电子邮件等.在此常见的协议有:HTTP,HTTPS,FTP,TELNET ...
- 使用百度地图api可视化聚类结果
1.写在前面 上接YFCC 100M数据集分析笔记,在对聚类出的照片GEO集聚类后,为了方便检测聚类结果,我们显示直接采用了 python 的 matplotlib 库以经纬度为坐标画出聚类结果,但发 ...
- LeetCode题解:(114) Flatten Binary Tree to Linked List
题目说明 Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 ...