小明是今年参加复试的外校考生,他要去民主楼小礼堂签到。由于对中南大学校本部很不熟悉,小明找到了这边读书的好朋友鲁大师,不巧,鲁大师在忙着自由探索项目的结题工作,不能给他带路,只好给他发了一份半成品的电子地图。地图上只列出了校本部内的N个点,M条路,小明处于S点,民主楼小礼堂是T点。小明感谢鲁大师,当然只是在拿到地图的一瞬间,后面的情况让他知道这半成品到底有多坑。鲁大师制作的电子地图是带有语音提示功能的,但是在编号为奇数的点他要等1分钟才能告诉他具体怎么走,而在编号为偶数的点要等2分钟。现在告诉你地图的具体情况,小明想知道他能不能在A分钟内赶到民主楼小礼堂。
输入
输入数据有多组,每组占M+1行,第一行有5个数字N,M,S,T,A,接下来M行,每行三个数字u,v,t,代表每条路的两个顶点和步行时间。(输入数据保证不含重边0<N<M<1000)
输出
对于每组输入数据,输出一行,小明能在A分钟内赶到民主楼小礼堂输出YES和总共花费的时间,否则输出KENG
样例输入
4 3 1 4 10
1 2 1
3 2 2
3 4 3
5 4 2 4 7
1 2 5
5 4 2
3 5 1
2 3 1
样例输出
YES 10
KENG
#include <iostream>
#include <malloc.h>
using namespace std;
#define maxsize 1001
typedef struct Graph{
int road[maxsize][maxsize];
int n;
};
int dijistra(Graph *g,int s,int t){
//初始化
int dist[g->n+1],path[g->n+1],set[g->n+1];
for(int i=1;i<=g->n;++i){
if( g->road[s][i] != 0 ){
dist[i]=g->road[s][i];path[i]=s;set[i]=0;
}else{
dist[i]=0;path[i]=-1;set[i]=0;
}
}
set[s]=1;
//操作
for(int i=1;i<g->n;++i){
int min=1000000;int bg;
for(int j=1;j<=g->n;++j){
if( set[j]==0&&dist[j] < min && dist[j]>0 ){
bg = j;min = dist[j];
}
}
set[bg]=1;
//更新dist bg%2==0?2:1
for(int j=1;j<=g->n;++j){
if(set[j]==0 && g->road[bg][j] > 0){
if(dist[j] > dist[bg] + g->road[bg][j] || dist[j] == 0){
dist[j] = dist[bg] + g->road[bg][j];
path[j]=bg;
}
}
}
}
// cout<<"结果"<<endl;
// cout<<"set"<<" dist"<<" path"<<endl;
// for(int i=1;i<=g->n;++i){
// cout<<set[i]<<" "<<dist[i]<<" "<<path[i]<<endl;
// }
return dist[t];
}
int main(){
int n,m,s,t,a;//n个点,m条路,s起点,t终点,a时间
while(cin>>n>>m>>s>>t>>a){
Graph *g;
g = (Graph*)malloc(sizeof(Graph));
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
g->road[i][j]=0;
g->n = n;
for(int i=0;i<m;++i){
int st,en,va;cin>>st>>en>>va;
if(st%2==0){
g->road[st][en] = va+2;
}else{
g->road[st][en] = va+1;
}
if(en%2==0){
g->road[en][st] = va+2;
}
else{
g->road[en][st] = va+1;
}
}
int result = dijistra(g,s,t);
if( result <=a )
cout<<"YES "<<result<<endl;
else
cout<<"KENG"<<endl;
}
}