题目:
思路:
本题是一个典型的有向图求强连通分量的题目,求得强连通分量后,对每个强连通分量中的结点进行统计,最后将每个强连通分量的城市对的组合数相加就是最后答案。这里我使用的是Kosaraju算法求得得强连通分量。
Kosaraju算法分为两个步骤:
(1)对原图进行DFS遍历,求得该图得逆后序遍历顺序;
(2)将原图取反,按照第一步取得得遍历顺序对图进行DFS遍历,每次DFS遍历中得结点即属于一个强连通分量。
关于Kosaraju算法,有个不错得博客,详情见https://www.cnblogs.com/nullzx/p/6437926.html。
代码:
import java.util.*;
public class Main {
public static void dfs(Vertex vertex,int[] visit,Stack<Vertex> stack){
int num = vertex.num;
if(visit[num]==0){
visit[num]=1;
for(int i=0;i<vertex.edgeTo.size();i++