前言
图论题,硬伤
题目
Time Limits: 1000 ms Memory Limits: 65536 KB
翠亨村举行一场自行车赛,翠亨村有N个路口(编号1到N),另有M条双向边连接起来。下面有几个定义:
•路径:由一系列边组成,满足后一条边的起点为前一条边的终点;
•简单路径:每个路口最多经过一次的路径;
•环:起点和终点在同一个路口的简单路径。
保证每对路口之间至少有一条路径相连,除此之外还满足每条边最多只会出现在一个环中。
你的任务是找出最长的满足以下两个条件的路径:
•起点可以在任意路口,但终点必须在1号路口;
•路径可能多次经过同一个路口,但每条边最多只会经过一次。
Input
第一行包含两个整数N和M(2<=N<=10000,1<=M<=2N-2),表示路口数量和边的数量。
接下来M行,每行包含两个不同的整数A和B(1<=A,B<=N),表示A和B之间存在一条边直接相连,两个路口之间最多只有一条边直接相连。
Output
输出最长的比赛路径的长度。
Sample Input
输入1: 4 3 1 2 1 3 2 4 输入2: 6 6 1 2 1 3 2 4 3 4 3 5 5 6 输入3: 5 6 1 2 2 3 3 4 4 5 5 3 3 1
Sample Output
输出1: 2 输出2: 5 输出3:6
分析
言简意赅——我不会qwq...
贴个题解挖个坑
首先将寻找终点为1号结点的路径改为寻找起点为1号结点的路径。
然后对于每一条边,它要么是环的一部分,要么是一个桥。
首先可以用tarjan算法辨认一条边是环的一部分还是桥,并记录dfn,lowlink等数值。
对于一个环,我们说它“悬挂”在结点X上,当且仅当X是这个环中dfn数值最小的;对于一个桥,我们说它“悬挂”在结点X上,当且仅当X是这个桥中dfn较小的那一个。
对于每个结点X,我们定义它的子图为结点X以及“悬挂”在X上的环的所有结点的子图以及“悬挂”在X上的桥的另一结点的子图的并集。
对于每一个结点X维护两个数值,circle(X) - X的子图中始于X终于X的路径,path(X) - X的子图中始于X终于任意结点的路径。
circle(X)可以被简单的递归计算为“悬挂”在X上的所有环的长度之和以及那些环上的每一个结点Y的circle(Y)之和。
对于path(X),我们可以选择以下三种方案进行计算,并取它们结果的最大值:
一、始于X终于X的路径。即path(X)=circle(X)。
二、首先在X的子图上走一个环,然后再通过一个“悬挂”在X上的桥并进入一个新的子图,使得path(X)=circle(X)+path(Y),其中Y是桥的另一边的结点。
三、通过X上所有的“悬挂”在X上的环,直到到达环上的一个被选定的结点才结束。在这种情况下有两个方向到达该结点,我们需要选择路径较长的那一个。
最后输出path(1)即可。
代码
找了半天也只找到一个:https://www.cnblogs.com/anbujingying/p/11316554.html