CSP201509-4高速公路

题目:

CSP201509-4高速公路_第1张图片

思路:

本题是一个典型的有向图求强连通分量的题目,求得强连通分量后,对每个强连通分量中的结点进行统计,最后将每个强连通分量的城市对的组合数相加就是最后答案。这里我使用的是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 stack){

        int num = vertex.num;
        if(visit[num]==0){
            visit[num]=1;
            for(int i=0;i=(n-m+1); --i)
            ans *= i;
        while(m!=0)
            ans /= m--;
        return ans;
    }

    public static void rdfs(Vertex vertex,int[] visit,int level){
        int num = vertex.num;
        if(visit[num]==0){
            visit[num]=1;
            vertex.level = level;
            for(int i=0;i list = new ArrayList();

        for(int i=0;i stack = new Stack();
        for (int i=0;i=2)
                res+=Combination(temp,2);
        }
        System.out.println(res);
    }
}

class Vertex{
    List edgeTo;
    List edgeFrom;
    int num;
    int level;
    public Vertex(int num){
        this.num = num;
        edgeTo = new ArrayList();
        edgeFrom = new ArrayList();
    }
}
class Edge{
    Vertex vertexFrom;
    Vertex vertexTo;
    public Edge(Vertex vertexFrom,Vertex vertexTo){
        this.vertexFrom = vertexFrom;
        this.vertexTo = vertexTo;
    }
}

 

你可能感兴趣的:(CSP)