PIPIOJ 1010: 好坑的电子地图

题目链接:
传送门

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

样例示意图:
在这里插入图片描述
在这里插入图片描述
题目思路:
dijkstra算法的变题,要考虑题干中提到的等待时间,总体而言,难度适中。

dijkstra算法题解c参考代码:

#include <stdio.h>
#include <string.h>

#define INF 0x3f3f3f3f
#define MAX 1001

int n,m,s,t,a;
int visited[MAX];
int map[MAX][MAX];
int dist[MAX];
int wt[MAX];

void dijkstra()
{
    
    
	memset(visited,0,sizeof(visited));
	int i,j;
	
	if(s%2==0)
	 wt[s]=2;
	else
	 wt[s]=1;
	 
	for(i=1;i<=n;i++)
	 dist[i]=map[s][i]+wt[s];
	
	visited[s]=1;
	
	for(i=1;i<n;i++)
	{
    
    
		int min=INF,pos;
		for(j=1;j<=n;j++)
		{
    
    
			if(visited[j]==0&&dist[j]<min)
			{
    
    
				min=dist[j];
				pos=j;
			}
		}
		
        visited[pos]=1;
        
		if(pos%2==0)
		 wt[pos]=2;
		else
		 wt[pos]=1;
		
		for(j=1;j<=n;j++)
		{
    
    
			if(visited[j]==0&&dist[j]>dist[pos]+map[pos][j]+wt[pos])
			 dist[j]=dist[pos]+map[pos][j]+wt[pos];
		}
	}
}

int main()
{
    
    
	int i,x,y,w;
	
	while(scanf("%d%d%d%d%d",&n,&m,&s,&t,&a)!=EOF)
	{
    
    
		memset(map,INF,sizeof(map));
		for(i=1;i<=n;i++)
		 map[i][i]=0;
		
		for(i=0;i<m;i++)
		{
    
    
			scanf("%d%d%d",&x,&y,&w);
            map[x][y]=map[y][x]=w;
		}
		
	  dijkstra();
	
	 if(dist[t]<=a)
	  printf("YES %d\n",dist[t]);
	 else
	  printf("KENG\n");
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46139801/article/details/114749220