第四章测试
1.

以下说法,错误的是( )。


A:加权无向图是一个包含顶点和加权有向边的图结构 B:有向图是一个包含顶点和有向边的图结构 C:无向图是一个包含顶点和无向边的图结构 D:其他选项均不正确
答案:A
2.

关于有向图的最短路径计算,正确的是( )。


A:Bellman-Ford算法不能处理带有负权重回路的加权有向图 B:Dijkstra算法不能处理带有负权重的加权有向图 C:拓扑排序算法不能处理存在回路的加权有向图
答案:ABC
3.用于计算最短路径的Dijkstra和用于计算最小生成树的Prim算法是同一算法家族。( )
A:对 B:错
答案:A
4.

给定无向图的数据结构,进行插入和查找的操作,请根据要求填空。

public class Graph {

    private final int V;

    private int E;

private Bag<Integer>[] adj;

}

public class BreadthFirstPaths {

    private static final int INFINITY = Integer.MAX_VALUE;

    private boolean[] marked;  // marked[v] = is there an s-v path

    private int[] edgeTo;      // edgeTo[v] = previous edge on shortest s-v path

    private int[] distTo;      // distTo[v] = number of edges shortest s-v path

 

    public BreadthFirstPaths(Graph G, int s) {

        marked = new boolean[G.V()];

        distTo = new int[G.V()];

        edgeTo = new int[G.V()];

        bfs(G, s);

    }

    // breadth-first search from a single source

    private void bfs(Graph G, int s) {

        Queue<Integer> q = new Queue<Integer>();

        for (int v = 0; v < G.V(); v++)

            distTo[v] = INFINITY;

        distTo[s] = 0;

        marked[s] = (    ?   );

        q.enqueue(s);

 

        while (!q.isEmpty()) {

            int v = q.dequeue();

            for (int w : G.adj(v)) {

                if (!marked[w]) {

                    edgeTo[w] = v;

                    distTo[w] = distTo[v] + 1;

                    marked[w] = true;

                    q.enqueue(w);

                }

            }

        }

    }

}


A:true B:null C:false D:v
答案:A
5.

给定如下的加权图的数据结构,完成最小生成树的延时prim方法的计算(prim方法)操作。

public class Edge implements Comparable<Edge> {

    private final int v;

    private final int w;

private final double weight;

}

public class EdgeWeightedGraph {

    private final int V;

    private int E;

private Bag<Edge>[] adj;

}

public class LazyPrimMST {

    private static final double FLOATING_POINT_EPSILON = 1E-12;

 

    private double weight;       // total weight of MST

    private Queue<Edge> mst;     // edges in the MST

    private boolean[] marked;    // marked[v] = true iff v on tree

    private MinPQ<Edge> pq;      // edges with one endpoint in tree

 

    public LazyPrimMST(EdgeWeightedGraph G) {

        mst = new Queue<Edge>();

        pq = new MinPQ<Edge>();

        marked = new boolean[G.V()];

        for (int v = 0; v < G.V(); v++)     // run Prim from all vertices to

            if (!marked[v]) prim(G, v);     // get a minimum spanning forest

    }

 

    // run Prim's algorithm

private void prim(EdgeWeightedGraph G, int s) {

   marked[s] = true;

        for (Edge e : G.adj(s))

            if (!marked[e.other(s)]) (    ?   );

        while (!pq.isEmpty()) {                        // better to stop when mst has V-1 edges

            Edge e = pq.delMin();                      // smallest edge on pq

            int v = e.either(), w = e.other(v);        // two endpoints

            if (marked[v] && marked[w]) continue;      // lazy, both v and w already scanned

            mst.enqueue(e);                            // add e to MST

            weight += e.weight();

            if (!marked[v]) scan(G, v);               // v becomes part of tree

            if (!marked[w]) scan(G, w);               // w becomes part of tree

        }

    }

}



A:pq.insert(e) B:Pq.del(e) C:pq.delMin() D:pq.insert(s)
答案:A

点赞(3) dxwkbang
返回
顶部