编程语言
首页 > 编程语言> > C++最短路径——畅通工程续

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