链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。
输入描述:
第一行有4个正整数n,m,s,t。 接下来m行,每行3个数a,b,v描述一条无向道路a——b,长度为v。
输出描述:
如果有解,输出一行,表示满足条件的最短公交线路的长度c。 否则,输出“-1”
示例1
输入
3 3 1 2 1 2 3 2 3 4 1 3 5
输出
3
示例2
输入
3 3 1 2 1 2 5 2 3 3 1 3 1
输出
4
示例3
输入
3 1 1 1 1 2 1
输出
0
备注:
对于100%的测试数据: 1 ≤ s,t ≤ n ≤ 1000 1 ≤ m ≤ 10000 1 ≤ 道路的长度 ≤ 10000
迪杰斯特拉(dijkstra)模板题
1、理解迪杰斯特拉的原理
2、学会建图
注意:
二维数组存数字的话范围一般为【5e3】【5e3】
如果不存数字一般为【1e4】【1e4】
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
using namespace std;
//#define ll long long
const int INF=0x3f3f3f3f;
int n,m,s,t,vis[1000],a[1000][1000],dis[1000];
void dj(int s) {
for(int i=1; i<=n; i++) {
dis[i]=INF;//记录这个从起点到这个点的最小值
vis[i]=0;//防止起点和终点被重复访问
}
dis[s]=0;//起点到起点的距离为0
for(int i=1; i<=n; i++) {//找出从起点到没有访问过的点中,需要边权最小的点
int t=-1;
for(int j=1; j<=n; j++) {
if(!vis[j]&&(t==-1||dis[j]<dis[t]))
t=j;
}
if(t==-1)//如果 t 没有被更新,说明已经遍历所有的点,dijkstra就完成了
return;
vis[t]=1;//标记走过这个点了
for(int j=1; j<=n; j++) {//把这个点当成一个中转站,判断从起点到这个点,
if(dis[j]>dis[t]+a[t][j])//再从这个点到其它能去的点的权值能否变小,如果能就更新它
dis[j]=dis[t]+a[t][j];//即a->b = 6 而 a->c = 1,c->b = 2 ,所以 a ->b 的最小距离为 3 即松弛操作
}
}
}
int main() {
cin>>n>>m>>s>>t;//读入数据,n个点,m条边,从 s 点到 t 点的距离
memset(a,0x3f3f,sizeof(a));//初始化邻接矩阵的边权值
for(int i=1; i<=m; i++) {//读入边权值,建图
int x,y,w;
cin>>x>>y>>w;
a[x][y]=a[y][x]=min(a[x][y],w);
}
dj(s);
if(dis[t]==INF) cout<<-1<<endl;
else
cout<<dis[t]<<endl;
return 0;
}