dijstra

//给一个图求所有点到1号点最短路
//算法:dijstra
#include<bits/stdc++.h>
using namespace std;
typedef struct edge{int to;int cost;}edge;  //定义边,就是终点与权值
vector<edge>g[103];     //邻接表存边
int d[103];             //最短距离
typedef pair<int,int> p;//开PAIR存队列元素,第一个值是当前点到1号点当前最短距,用来排序
int main(){
    int n,e;cin>>n>>e;                  //输出点,边
    for(int i=1;i<=n;i++)d[i]=10000;    //初始化最大距离
    for(int i=1;i<=e;i++){              //逐条边输出
        int a,b,c;cin>>a>>b>>c;         //起点,终点,花费
        g[a].push_back(edge{b,c});      //正向存边
        g[b].push_back(edge{a,c});      //反向存边
    }
    priority_queue<p,vector<p>,greater<p> > pq; //默认是小于号,大的在队首,现在改为greater大于号,小的在队首
    pq.push(p(0,1));                //压入队列,距离与点编号
    while(!pq.empty()){             //队列非空
        int dis=pq.top().first;     //读出队首元素的距离
        int nowp=pq.top().second;   //读出队首先素的编号
        pq.pop();//弹出
        if(d[nowp]<dis)continue;            //如果当前已更新距离就已经比读出的距离短了就不用搜了
        for(int i=0;i<g[nowp].size();i++){  //这个点射出的逐条边扫一次
            int weight=g[nowp][i].cost;     //读出其权值
            int newp=g[nowp][i].to;         //读出其终点
            if(d[newp]>dis+weight){         //看能否松驰
                d[newp]=dis+weight;         //可以的话就松驰
                pq.push(p(dis+weight,newp));//然后压入队列
            }
        }
    }
    for(int i=2;i<=n;i++)cout<<d[i]<<' ';cout<<endl;    //输出2~N号点到1的距离
    return 0;
}//全码关键:就是区分edge与pair内两个成员变量顺序的不同的,是两个不同的结构体
/*
in
4 6
1 2 1
2 3 2
3 4 3
1 4 4
1 3 2
2 4 1
out
1 2 2
*/

猜你喜欢

转载自blog.csdn.net/cj1064789374/article/details/84890076
今日推荐