【图论-Tarjan】中山纪念中学暑期游Day7——自行车赛

前言

图论题,硬伤

题目

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值