您的位置:首页 > 其它

蓝桥杯 算法训练 最短路 【SPFA队列优化 + dijkstra优先队列优化】

2018-01-26 11:38 567 查看

算法训练 最短路

时间限制:1.0s 内存限制:256.0MB

问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式

第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式

共n-1行,第i行表示1号点到i+1号点的最短路。

样例输入

3 3

1 2 -1

2 3 -1

3 1 2

样例输出

-1

-2

数据规模与约定

对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

题意:给你一个有向图,n个顶点,m条边,求出1顶点离其他顶点的最短路径

分析: 经典的最短路问题,可以当做板子

spfa做法

#include<bits/stdc++.h>

using namespace std;
#define ll long long

const int maxn = 1e5 + 10;

vector<pair<int,int> > E[maxn];

int inq[maxn],n,m;
ll dis[maxn];

queue<int> q;

void spfa() {
for(int i = 0;i < maxn;i++) {
dis[i] = 2000000000;
inq[i] = 0;
}
dis[1] = 0;
q.push(1);
while(!q.empty()) {
int t = q.front();
q.pop();inq[t] = 0;
for(int i = 0;i < E[t].size();i++) {
int to = E[t][i].first;
ll di = E[t][i].second;
if(dis[to] > dis[t] + di) {
dis[to] = dis[t] + di;
if(!inq[to]) {
inq[to] = 1;
q.push(to);
}
}
}
}
}

int main(){
ios_base::sync_with_stdio(0);
init();
cin>>n>>m;
for(int i = 0;i < m;i++) {
int a,b,c;cin>>a>>b>>c;
E[a].push_back(make_pair(b,c));
}
spfa();
for(int i = 2;i <= n;i++) {
cout<<dis[i]<<endl;
}
return 0;
}


dijkstra做法

#include<bits/stdc++.h>

using namespace std;

#define ll long long

const int maxn = 1e5 + 10;

vector<pair<int,int> > E[maxn];

int n,m,dis[maxn];

priority_queue<pair<int,int> > q;

void dij() {
for(int i = 0;i < maxn;++i) {
dis[i] = 1e9;
}
dis[1] = 0;
q.push(make_pair(0,1));
while (!q.empty()) {
int t = q.top().second;
q.pop();
for(int i = 0;i < E[t].size();++i) {
int to = E[t][i].first;
int di = E[t][i].second;
if(dis[to] > dis[t] + di) {
dis[to] = dis[t] + di;
q.push(make_pair(-dis[to],to));
}
}
}
}

int main(){
ios_base::sync_with_stdio(0);
cin>>n>>m;
for(int i = 0;i < m;i++) {
int a,b,c;cin>>a>>b>>c;
E[a].push_back(make_pair(b,c));
}
dij();
for(int i = 2;i <= n;i++) {
cout<<dis[i]<<endl;
}
return 0;
}


如有错误或遗漏,请私聊下UP,thx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: