TSP

来源:互联网 发布:lns是什么社交软件 编辑:程序博客网 时间:2024/04/24 05:49

题目

Shrek是一个大山里的邮递员,每天负责给所在地区的n个村庄派发信件。但杯具的是,由于道路狭窄,年久失修,村庄间的道路都只能单向通过,甚至有些村庄无法从任意一个村庄到达。这样我们只能希望尽可能多的村庄可以收到投递的信件。

Shrek希望知道如何选定一个村庄A作为起点(我们将他空投到该村庄),依次经过尽可能多的村庄,路途中的每个村庄都经过仅一次,最终到达终点村庄B,完成整个送信过程。这个任务交给你来完成。

输入:

第一行包括两个整数n,m,分别表示村庄的个数以及可以通行的道路的数目。
以下共m行,每行用两个整数v1和v2表示一条道路,两个整数分别为道路连接的村庄号,道路的方向为从v1至v2,n个村庄编号为[1, n]。

输出:一个数字,表示符合条件的最长道路经过的村庄数。

样例:
这里写图片描述

限制:

1 ≤ n ≤ 1,000,000
0 ≤ m ≤ 1,000,000

输入保证道路之间没有形成环
时间:2 sec
空间:256 MB

提示:拓扑排序

思路

1.什么是拓扑排序?
给定描述某一实际应用的有向图,在“相容”的前提下,将所有定点排成一个线性序列。“相容”是指,每一顶点都不会通过边,指向其在此序列中的前驱顶点。这样一个线性序列,称作原有向图的一个拓扑排序。

不含环路的有向图,一定存在拓扑排序。

拓扑排序可以基于DFS算法实现。DFS搜索过程中,各顶点被标记为VISITED的次序,恰好按照逆序给出了原图的一个拓扑排序。而在此搜索过程中,一旦发现BACKWARD,说明输入有环,非DAG(有向无环图)而无法进行拓扑排序。

2.用邻接表存储输入的图结构,用一个栈存储来保存拓扑排序,用一个全局变量maxLength来动态记录“符合条件的最长道路经过的村庄数”。

实现

0 0