C++最短路径——畅通工程续
作者:互联网
【题目】
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
【输入】
第一行:N(0<N<200),M(0<M<1000),分别代表城镇数和已修道路数。
接下来M行,A,B,X,表示A—B(X)的双向道路。
再接下来的下一行:S(起点),T(终点)。
【输出】
输出最短需要行走的距离。若不存在则输出-1;
【样例输入】
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
【样例输出】
2 -1
【代码】
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#include<climits>
using namespace std;
const int MAXN=200;
const int INF=INT_MAX;//无穷大设为很大的数
struct Edge{
int to;//终点
int length;
Edge(int t,int l){
to=t;
length=l;
}
};
struct Point{
int number;
int distance;
Point(int n,int d)
{
number=n;
distance=d;
}
bool operator<(const Point&p)const{
return distance>p.distance;//距离小的优先级高
}
};
vector<Edge> graph[MAXN];//邻接表实现的图
int dis[MAXN];//源点到各点距离
void Dijkstra(int s){
priority_queue<Point> myPriorityQueue;
dis[s]=0;
myPriorityQueue.push(Point(s,dis[s]));
while(!myPriorityQueue.empty()){
int u=myPriorityQueue.top().number;//离源点最近的点
myPriorityQueue.pop();
for(int i=0;i<graph[u].size();i++)
{
int v=graph[u][i].to;
int d=graph[u][i].length;
if(dis[v]>dis[u]+d){
dis[v]=dis[u]+d;
myPriorityQueue.push(Point(v,dis[v]));
}
}
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
memset(graph,0,sizeof(graph));//图初始化
fill(dis,dis+n,INF);//距离初始化为无穷
while(m--)
{
int from,to,length;
cin>>from>>to>>length;
graph[from].push_back(Edge(to,length));
graph[to].push_back(Edge(from,length));
}
int s,t;
cin>>s>>t;
Dijkstra(s);
if(dis[t]==INF)
dis[t]=-1;
cout<<dis[t]<<endl;
}
return 0;
}
标签:int,graph,C++,最短,length,畅通,include,myPriorityQueue,dis 来源: https://blog.csdn.net/qq_36935691/article/details/113835360