好坑的电子地图(最短路问题)

本质就是求起点到终点的最短路问题,图论中的最短路一般有两种情况,一种是带负权边的,一种是非负权边的问题,本题显然是非负权边的问题,但是他在以往的基础上还多给了条件,就是出发的时候需要看地图,且奇数和偶数看的时间不一样,这里我们其实可以把多出来的时间直接算到边权里边就好了,在输入的时候处理一下,用dijkstra做就好了。

本题采用邻接表存储图,注意这里是无向图。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=1010,M=2*N;

int h[N],e[M],ne[M],w[M],idx;
int n,m,start,endss,value;

int dis[N];//最短路数组
bool st[N];//判断是否已经是最短

void add(int a,int b,int c)//加边
{
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}

void dij()
{
    memset(dis,0x3f,sizeof dis);//初始化
    dis[start]=0;
    for(int i=0;i<n-1;i++)//找到当前距离起点最短的点
    {
        int t=-1;
        for(int j=1;j<=n;j++)
        {
            if(!st[j]&&(t==-1||dis[t]>dis[j]))t=j;
        }
        st[t]=true;//标记
        
        for(int j=h[t];j!=-1;j=ne[j])//遍历其链接的点
        {
            int k=e[j];
            dis[k]=min(dis[k],dis[t]+w[j]);
        }
    }
}

int main()
{
    while(cin>>n>>m>>start>>endss>>value)
    {
        memset(h,-1,sizeof h);
        memset(st,false,sizeof st);
        idx=0;
        while(m--)
        {
            int a,b,c;
            cin>>a>>b>>c;
            if(a%2==0)
            {
                add(a,b,c+2);
            }
            else
            {
                add(a,b,c+1);
            }
            if(b%2==0)
            {
                add(b,a,c+2);
            }
            else
            {
                add(b,a,c+1);
            }
        }
        dij();
        if(dis[endss]>value)cout<<"KENG"<<endl;
        else cout<<"YES "<<dis[endss]<<endl;
    }
   
    return 0;
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值