BZOJ.4727.[POI2017]Turysta(哈密顿路径/回路 竞赛图)
题目链接
\(Description\)
给出一个n个点的有向图,任意两个点之间有且仅一条有向边。对于每个点v,求出从v出发的一条经过点数最多,且没有重复经过同一个点一次以上的简单路径。
n<=2000
\(Solution\)
详细题解在这
竞赛图缩点后得到的拓扑图一定是一条链,因为竞赛图任意两点前后关系确定,所以只有一种拓扑序列
从前边强连通分量中的任意一点出来 都可以到达后边强连通分量的任意一点
因为竞赛图的每个强连通分量一定存在一条哈密顿回路
所以只需要求出每一个强连通分量的哈密顿回路,然后在链上走,把每个强连通分量的回路存起来中,最后按拓扑序从后往前输出即可
//4884kb 9220ms
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define gc() getchar()
const int N=2005;int n,dfn[N],low[N],id,cnt,bel[N],sk[N],top,nxt[N],dgr[N],pos[N];
bool mp[N][N],ins[N];
std::vector<int> scc[N];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
void Tarjan(int x)
{dfn[x]=low[x]=++id, sk[++top]=x, ins[x]=1;for(int i=1; i<=n; ++i)if(mp[x][i])if(!dfn[i]) Tarjan(i),low[x]=std::min(low[x],low[i]);else if(ins[i]) low[x]=std::min(low[x],dfn[i]);else ;//if(low[x]==dfn[x]){++cnt;do{bel[sk[top]]=cnt, ins[sk[top]]=0, scc[cnt].push_back(sk[top]);}while(x!=sk[top--]);}
}
inline bool cmp(const int &a,const int &b){return dgr[a]<dgr[b];
}
void Insert(int x)
{sk[++top]=x;for(int i=nxt[x]; i/*necessary(对于单独一个点)*/&&i!=x; i=nxt[i]) sk[++top]=i;
}int main()
{n=read();for(int i=2; i<=n; ++i)for(int j=1; j<i; ++j)mp[j][i]=read(), mp[i][j]=mp[j][i]^1;for(int i=1; i<=n; ++i)if(!dfn[i]) Tarjan(i);for(int l,r,sz,i=1; i<=cnt; ++i){l=r=scc[i][0], sz=scc[i].size();for(int tmp,j=1; j<sz; ++j)//从1个点开始 扩展成哈密顿路径 {tmp=scc[i][j];if(mp[tmp][l]) nxt[tmp]=l, l=tmp;else if(mp[r][tmp]) nxt[r]=tmp, r=tmp;else{for(int k=l; nxt[k]; k=nxt[k])if(mp[k][tmp]&&mp[tmp][nxt[k]])//在当前路径上找 连向tmp同时tmp连向其后边节点的 {nxt[tmp]=nxt[k], nxt[k]=tmp;break;}}}r=0;for(int j=l; j; j=nxt[j])if(r){for(int k=r,las=l; ; las=k,k=nxt[k]){if(mp[j][k]){nxt[las]=nxt[l];if(las!=l) nxt[l]=r;r=k, l=j;break;}if(k==l) break;}}else if(mp[j][l]) r=l, l=j;nxt[l]=r;}for(int i=1; i<=n; ++i)//对每个强连通分量拓扑排序 for(int j=1; j<=n; ++j)if(bel[i]!=bel[j]&&mp[i][j]) ++dgr[bel[j]];for(int i=1; i<=cnt; ++i) pos[i]=i, dgr[i]/=scc[i].size();//度数要除以size 因为连向强连通分量i的点会连向i中所有点(竞赛图) 而此时拓扑是要对强连通分量的入度排序 std::sort(pos+1,pos+1+cnt,cmp);for(int i=1; i<=n; ++i){top=0, Insert(i);//直接加入i这个强连通分量即可,走一遍回路,然后再从终点走到下一个强连通分量 //bel[i]中每个点一定都可以走到下一个强连通分量j,否则bel[i]和j就成了环(同一个强连通分量)了 for(int j=1; j<=cnt; ++j)//按照拓扑序添加scc(路径) if(dgr[pos[j]]>dgr[bel[i]])Insert(scc[pos[j]][0]);printf("%d ",top);for(int i=1; i<top; ++i) printf("%d ",sk[i]);printf("%d\n",sk[top]);}return 0;
}
转载于:https://www.cnblogs.com/SovietPower/p/8503752.html
BZOJ.4727.[POI2017]Turysta(哈密顿路径/回路 竞赛图)相关推荐
- bzoj4727 [POI2017]Turysta(竞赛图构造哈密顿回路)
bzoj4727 [POI2017]Turysta 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4727 题意: 给出一个n个点的有向图, ...
- 哈密顿路径 竞赛图
哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,就是哈密顿回路.存在哈密顿回路的图就是哈密顿图.哈密顿图就是从一点出发,经过所有的必须且只能一次,最终回到起点的路径. 图中有边可以不经 ...
- 哈密顿回路 竞赛图 构造哈密顿回路(待更新)
哈密顿回路 1.哈密顿回路 图G的一个回路,该回路除了经过初始结点两次以外,恰好经过每个结点一次,则称此回路为哈密顿回路.哈密顿回路中每个结点都为偶结点且入度和出度均为1 2.哈密顿路径 一条路径上每 ...
- 【算法笔记】竞赛图(有向完全图)(相关题型总结)
整理的算法模板合集: ACM模板 目录 竞赛图(有向完全图) 一.兰道定理 例题HDU 5873 Football Games 二.求竞赛图的任意三元环 三.求竞赛图的哈密顿回路数量的期望 竞赛图(有 ...
- 【计算理论】计算复杂性 ( NP 完全问题 | 顶点覆盖问题 | 哈密顿路径问题 | 旅行商问题 | 子集和问题 )
文章目录 一.顶点覆盖问题 二.哈密顿路径问题 三.旅行商问题 四.子集和问题 五.NP 完全问题 一.顶点覆盖问题 顶点覆盖 ( Vertex Cover ) : 给定一个 无向图 G\rm GG ...
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...
- HDU 5544 Ba Gua Zhen ( 2015 CCPC 南阳 C、DFS+时间戳搜独立回路、线性基 )
题目链接 题意 : 给出一副简单图.要你找出一个回路.使得其路径上边权的异或和最大 分析 : 类似的题有 BZOJ 2115 对于这种异或最长路的题目(走过的边可以重复走) 答案必定是由一条简单路径( ...
- 哈密顿回路、链路、竞赛图
目录 一,哈密顿回路.哈密顿链路 二,Dirac定理 三,算法 力扣 996. 正方形数组的数目 力扣 980. 不同路径 III 四,竞赛图 五,相关puzzle 1,数字满格 2,马的哈密顿回路. ...
- 哈密尔顿回路(旅行售货员问题)
哈密尔顿回路(旅行售货员问题) 哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过 ...
最新文章
- RFID标签分类(按频率)
- matlab 神经网络预测时间序列示例(水痘模型)
- Android开发关于网络的书记,Android开发需要了解的网络协议
- linux opencv
- 【技术学习】一次Node.js站点渗透
- 序列化推荐系统总结:Sequential Recommender Systems: Challenges, Progress and Prospect
- hibernate多对多、正向工程创建数据表——访问温馨提示
- 搭建hadoop开发环境--基于xp+cygwin
- flowable springboot 集成 flowableDMN_05
- CVPR 2020 细粒度分类挑战赛冠军方案:数据增强+知识蒸馏,效果大幅提升
- FTP下载利器FlashFXP【原创 HOHO】
- golang面向对象思想和实现
- 【UCSC Genome Browser】- 小技巧
- Linux的du命令
- python判断谁做了好事
- 国内互联网大数据的发展现状和应用
- 计算机应用情话,情话大全浪漫情话 最美的情话莫过于我也爱你
- ZooKeeper客户端Curator的基本使用
- Qt Creator 运行LVGL模拟器
- log4cpp源码阅读:Appender组件学习