//给一个图求所有点到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
*/
dijstra
最新推荐文章于 2019-03-13 21:20:58 发布