pipioj

小明是今年参加复试的外校考生,他要去民主楼小礼堂签到。由于对中南大学校本部很不熟悉,小明找到了这边读书的好朋友鲁大师,不巧,鲁大师在忙着自由探索项目的结题工作,不能给他带路,只好给他发了一份半成品的电子地图。地图上只列出了校本部内的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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40128883/article/details/88562774