找到图表的最短路径时出错

时间:2016-05-08 03:57:21

标签: c++ algorithm dijkstra

我编写了代码来输出两个节点之间的最短路径 输入格式 - 第一行包含两个数字,表示节点边缘,第二行包含2个数字,其中最短路径必须计算,然后边缘线的数量如下


我的代码输入的数量多于边数
e.g -

  

7 9
  0 6
  0 1 1
  0 2 1
  0 3 2
  0 4 3
  1 5 2
  2 6 4
  3 6 2
  4 6 4
  5 6 1
  代码需要13个输入,我无法找到错误

代码

#include<iostream>
#include<cstring>
#include<vector> 
#include<queue>
typedef pair <long long int ,long long int> p;
vector<p> adj[100000];
vector<int> ver[100000];
void dijkstra(long long int x,long long int b);
int main()
  {
  long long nodes,t,edges,x,y,weight,a,b;
    cin>>nodes>>edges;
    cin>>a>>b;
    for(long long int i=1;i<=edges;i++)
      {
      cin>>x>>y>>weight;    
      adj[x].push_back(make_pair(weight,y));
      } 
    dijkstra(a,b);
  return 0;
}

void dijkstra(long long int a,long long int b)
  {
  priority_queue< p,vector<p>,greater <p> > q;
  long long int cost[100000];
  memset(cost,1000000,sizeof(cost));
  q.push(make_pair(0,a));
  cost[a]=0;
  while(!q.empty())
   {
      p pi=q.top();  
      q.pop();
     long long int u=pi.second;   //vertex
      long long int v=pi.first;    //weight
      if(cost[u]<v)  
      continue;      
      for(long long int i=0;i<adj[u].size();i++)
      {
       long long int w=adj[u][i].first;   //edge weight
       long long int x=adj[u][i].second; //vertex

        if(cost[x]>cost[u]+w)
          {
              ver[u].clear();
              ver[u].push_back(x);//prevcost[x]=cost[x];    
              cost[x]=cost[u]+w;
              q.push(p(cost[x],x)); 

          }
          if(cost[x]=cost[u]+w)
          ver[u].push_back(x);
      }
    }

  for(long long int i=0;i<ver[b].size();i++)
  cout<<ver[b][i]<<"->";
  cout<<"\n";
 }  

1 个答案:

答案 0 :(得分:0)

这是您的代码的精简版本,只接受来自终端的输入。不要在vector中存储值或调用dijkstra函数。 根据需要只需要输入9个边....

#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
//typedef pair <long long int ,long long int> p;
///vector<p> adj[100000];
//vector<int> ver[100000];
//void dijkstra(long long int x,long long int b);
using namespace std;
int main()
  {
    long long nodes,t,edges,x,y,weight,a,b;
    cin>>nodes>>edges;
    cin>>a>>b;
    cout<<"nodes "<<nodes<<"edges "<<edges<<endl;
    for(long long int i=1;i<=edges;i++)
      {
      cin>>x>>y>>weight;

      //adj[x].push_back(make_pair(weight,y));
      }
    //dijkstra(a,b);
  return 0;
}

请检查您通过终端输入数据的方式。