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
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值