我编写了代码来输出两个节点之间的最短路径 输入格式 - 第一行包含两个数字,表示节点和边缘,第二行包含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";
}
答案 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;
}
请检查您通过终端输入数据的方式。