题目链接

\(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(哈密顿路径/回路 竞赛图)相关推荐

  1. bzoj4727 [POI2017]Turysta(竞赛图构造哈密顿回路)

    bzoj4727 [POI2017]Turysta 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4727 题意: 给出一个n个点的有向图, ...

  2. 哈密顿路径 竞赛图

    哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,就是哈密顿回路.存在哈密顿回路的图就是哈密顿图.哈密顿图就是从一点出发,经过所有的必须且只能一次,最终回到起点的路径. 图中有边可以不经 ...

  3. 哈密顿回路 竞赛图 构造哈密顿回路(待更新)

    哈密顿回路 1.哈密顿回路 图G的一个回路,该回路除了经过初始结点两次以外,恰好经过每个结点一次,则称此回路为哈密顿回路.哈密顿回路中每个结点都为偶结点且入度和出度均为1 2.哈密顿路径 一条路径上每 ...

  4. 【算法笔记】竞赛图(有向完全图)(相关题型总结)

    整理的算法模板合集: ACM模板 目录 竞赛图(有向完全图) 一.兰道定理 例题HDU 5873 Football Games 二.求竞赛图的任意三元环 三.求竞赛图的哈密顿回路数量的期望 竞赛图(有 ...

  5. 【计算理论】计算复杂性 ( NP 完全问题 | 顶点覆盖问题 | 哈密顿路径问题 | 旅行商问题 | 子集和问题 )

    文章目录 一.顶点覆盖问题 二.哈密顿路径问题 三.旅行商问题 四.子集和问题 五.NP 完全问题 一.顶点覆盖问题 顶点覆盖 ( Vertex Cover ) : 给定一个 无向图 G\rm GG ...

  6. BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)

    BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...

  7. HDU 5544 Ba Gua Zhen ( 2015 CCPC 南阳 C、DFS+时间戳搜独立回路、线性基 )

    题目链接 题意 : 给出一副简单图.要你找出一个回路.使得其路径上边权的异或和最大 分析 : 类似的题有 BZOJ 2115 对于这种异或最长路的题目(走过的边可以重复走) 答案必定是由一条简单路径( ...

  8. 哈密顿回路、链路、竞赛图

    目录 一,哈密顿回路.哈密顿链路 二,Dirac定理 三,算法 力扣 996. 正方形数组的数目 力扣 980. 不同路径 III 四,竞赛图 五,相关puzzle 1,数字满格 2,马的哈密顿回路. ...

  9. 哈密尔顿回路(旅行售货员问题)

    哈密尔顿回路(旅行售货员问题) 哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过 ...

最新文章

  1. RFID标签分类(按频率)
  2. matlab 神经网络预测时间序列示例(水痘模型)
  3. Android开发关于网络的书记,Android开发需要了解的网络协议
  4. linux opencv
  5. 【技术学习】一次Node.js站点渗透
  6. 序列化推荐系统总结:Sequential Recommender Systems: Challenges, Progress and Prospect
  7. hibernate多对多、正向工程创建数据表——访问温馨提示
  8. 搭建hadoop开发环境--基于xp+cygwin
  9. flowable springboot 集成 flowableDMN_05
  10. CVPR 2020 细粒度分类挑战赛冠军方案:数据增强+知识蒸馏,效果大幅提升
  11. FTP下载利器FlashFXP【原创 HOHO】
  12. golang面向对象思想和实现
  13. 【UCSC Genome Browser】- 小技巧
  14. Linux的du命令
  15. python判断谁做了好事
  16. 国内互联网大数据的发展现状和应用
  17. 计算机应用情话,情话大全浪漫情话 最美的情话莫过于我也爱你
  18. ZooKeeper客户端Curator的基本使用
  19. Qt Creator 运行LVGL模拟器
  20. log4cpp源码阅读:Appender组件学习

热门文章

  1. Spring Boot 导出Excel表格
  2. 面向对象之反射和其他内置方法
  3. 20155213 2016-2017-2《Java程序设计》课程总结
  4. sql 中 ALTER 和 UPDATE 的区别
  5. html5标签兼容低版本浏览器
  6. HTML5商城开发四 多图或多商品的水平滚动展示
  7. 《网络编程》守护进程
  8. java开发环境eclipse的使用(模块代码折叠、可视化开发插件、生成Jar插件)
  9. 格式化显示(日期\货币)
  10. 西门子em235模块的功能_图文讲解PLC模拟量模块与传感器接线方法和注意事项