Dijkstra提升距离图给出了随机值

时间:2014-11-10 18:55:47

标签: boost distance dijkstra

我正在努力解决我被给予的问题:

  1. 图表 v顶点 e edge 以及边缘权重
  2. 输出:

    1. 最小生成树的权重
    2. 第一个节点(0)与最远节点(可以是除0之外的任何节点)之间的距离
    3. 问题:

      我的距离地图只存储一个随机的未知数字。

      我的输入是:

      5
      5 6
      0 1 1
      0 2 2 
      1 2 5
      1 3 1
      3 2 2
      2 4 3
      4 5
      1 0 91
      2 0 50
      2 1 849
      3 0 451
      3 1 724
      8 25
      1 0 91
      2 0 176
      2 1 658
      3 0 61
      3 1 740
      4 0 21
      4 1 817
      4 2 407
      4 3 469
      5 0 468
      5 1 493
      5 2 400
      5 3 814
      5 4 86
      6 0 611
      6 1 457
      6 2 776
      6 4 452
      6 5 4
      7 0 601
      7 2 722
      7 3 11
      7 4 249
      7 5 530
      7 6 632
      9 9
      1 0 64
      3 1 914
      4 1 331
      4 2 824
      5 3 509
      7 5 520
      7 6 460
      8 1 415
      8 7 263
      3 2
      1 0 533
      2 1 920
      

      第一个数字是测试用例的数量,然后对于每个测试用例,我有顶点数和边数,接着是顶点数(表示边的2个)和相应的权重。

      示例:

      testcases
      
      no_vert no_edges
      
      node_1 node_2 weight_1
      node_2 node_3 weight_2
      ect....
      

      输出:是生成树的权重以及第一个节点和最远节点之间的距离:

      7 5
      592 451
      450 176
      3386 1262
      1453 1453
      

      因此,我得到的不是正确的输出:

      7 5
      592 2147483647
      450 2147483647
      3386 2147483647
      

      这意味着我的dijkstras方法存在问题。我不是有错误的地方,我假设它是距离向量,但在哪里?

      这是我的代码

      //============================================================================
      // Name        : boost_ex_1.cpp
      // Author      : priya
      // Version     :
      // Copyright   : Your copyright notice
      // Description : Hello World in C++, Ansi-style
      //============================================================================
      
      #include <iostream>
      
      #include<vector>
      #include<algorithm>
      #include<boost/graph/adjacency_list.hpp>
      #include<boost/graph/prim_minimum_spanning_tree.hpp>
      #include<boost/graph/dijkstra_shortest_paths.hpp>
      #include<boost/graph/kruskal_min_spanning_tree.hpp>
      
      using namespace std;
      using namespace boost;
      
      typedef adjacency_list<vecS, vecS, directedS, no_property,property<edge_weight_t, int> > Graph;
      
          //vertex and edge descriptor
          typedef graph_traits<Graph>::vertex_descriptor Vertex;
          typedef graph_traits<Graph>::edge_descriptor Edge;
      
      
      int testcases();
      
      int main() {
          ios_base::sync_with_stdio(false);
          int n=0;
          cin>>n;
          while(n--)
          {
              testcases();
          }
      
          return 0;
      }
      
      
      int testcases()
      {
          //creation of graphs
      
      
          //get number of edges and vertices
      
          int NEDGES,NVERT;
          cin>>NVERT>>NEDGES;
      
          //graph g
      
          Graph g(NVERT);
          Vertex SOURCE=0;
          int a,b,c;
      
          //property map for edge weights
          property_map<Graph,edge_weight_t>::type weightMap = get(edge_weight,g);
      
          //fill graph details in g
      
          for(int i=0;i<NEDGES;++i)
          {
              cin >> a >> b >> c;
              bool success;
              Edge e;
              tie(e,success) = add_edge(a,b,g);
              weightMap[e]=c;
          }
      
      //filled graph with edges and vertices and weight in weightMap
      
          vector<Edge> spanning_tree;
          kruskal_minimum_spanning_tree(g,back_inserter(spanning_tree));
      
          a=0;
      
          for(vector<Edge>::iterator ei=spanning_tree.begin();ei!=spanning_tree.end();++ei)
          {
              a+=weightMap[*ei];
          }
      
      
          vector<int>distancep(NVERT); //distance ebtween nodes
      
          dijkstra_shortest_paths(g,SOURCE,distance_map(&distancep[0]));
          b=0;
      
          for(int i=0;i<num_vertices(g);++i)
          {
      
            b=max(b,distancep[i]);
          }
      
      
          cout << a <<" "<< b << endl;
      
      
      
      
          return 0;
      
          }
      

      如果有人能帮助我,我将非常感激。

      谢谢。

      编辑:: 此外,正如您在我的输出中所看到的,最后一个输出缺失,我也无法找出原因。谢谢

1 个答案:

答案 0 :(得分:2)

我想发布答案,以防有人遇到同样的问题。

所以,第一个问题是while循环应该是

while(n--)

不会

while(--n)

它错过了输入的测试用例。

其次,我已将grah声明为directedS,这是错误的,应该是undirectedS,而给出了随机距离值,因为距离的值是空的。