牛客小白月赛10 D 饥饿(最短路)

题目传送门

题目描述

夕阳西下,匆匆忙忙间,SSJ一天的课程已经全部上完了,肚子咕咕开始叫了,坐上回家的公交车,可是SSJ今天好像有点迷,据说今中午吃饭时没去食堂,走着走着,外边景色好美啊,啊?我好像没走过这,完了,我好想迷路了。
公交车到了终点站,SSJ下车了,内心无比紧张,回不去了,一阵冷风吹过,瑟瑟发抖,emm…,那是一张地图?地图上有啥大家都明白,SSJ现在已经饿得无力思考了,请你帮他设计一条最快回家的路下,他要快点回家吃xxx。

输入描述:

第一行四个数n,m,s,t。(分别表示有地图上n个地点,m条道路,SSJ在s处,他家在t处)第2-m+1三个正整数,f,u(某条路起点),v(到达点),w(路径距离)。(f为1或0,0表示这条道路上有恶狗拦路,SSJ已无力与恶狗打斗了,所以他要避开这些道路,1表示此条道路无危险)。

输出描述:

第一行一个数表示最短路径长度,若无法回家输出“My gold!!!”(无引号)若可以回家.
示例1

输入

5 7 1 5
0 1 4 4
1 1 3 2
1 1 5 7
1 2 5 10
0 2 3 1
1 3 5 2
1 4 3 7

输出

4

备注:
n≤10000,m≤200000,w≤5000000

思路,就是n个点,m条路,0代表这条路不能走,1代表能走,求s到t的最短路,很裸的一道题,应该用dijkstra和spfa都能写,这里用spfa写的,没事好说的,spfa模板题。

#include<bits/stdc++.h>
const int N=1e6+10;
const int inf=0x3f3f3f3f;
using namespace std;
struct node{
    int to,cost,next;
}rode[N*2];
int head[N],vis[N],tol,dis[N],n,m,s,t,d;
int t1,t2,t3;
void add(int a,int b,int c){//链式前向星存图
    rode[tol].to=b;
    rode[tol].cost=c;
    rode[tol].next=head[a];
    head[a]=tol++;
}
void spfa(){//spfa寻路
    queue<int>q;
    fill(dis,dis+N,inf);
    dis[s]=0;
    vis[s]=1;
    q.push(s);
    while(!q.empty()){
        int v=q.front();
        q.pop();
        vis[v]=0;
        for(int i=head[v];i!=-1;i=rode[i].next)
        {
            node e=rode[i];
            if(dis[e.to]>dis[v]+e.cost)
            {
                dis[e.to]=dis[v]+e.cost;
                if(!vis[e.to])
                {
                    q.push(e.to);
                    vis[e.to]=1;
                }
            }
        }
    }
}
int main()
{
       
    cin>>n>>m>>s>>t;
    memset(head,-1,sizeof head);
    tol=0;
    for(int i=1;i<=m;i++)
    {
        cin>>d>>t1>>t2>>t3;
        if(d)
        {
            add(t1,t2,t3);
            add(t2,t1,t3);
        }
    }
    spfa();
     
     cout<<dis[t]<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值