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