牛客----线路

链接:登录—专业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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值