题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459
最短路算法的小小拓展,给出起点终点,最起点到终点的最短路径中分数最大的那一条。
输出最短路和对应的最大分数。
基础入门题。
AC代码:
#include <iostream>
#include <stdio.h>
#include <vector>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 502;
int Map[maxn][maxn];
int score[maxn];
int n,m,Start,End;
void initMap()
{
for(int i = 0; i < n; i++)
{
Map[i][i] = 0;
for(int j =i+1; j < n; j++)
Map[i][j] = Map[j][i] = inf;
}
}
int dist[maxn],maxscore[maxn];
void dijkstra()
{
int vis[maxn];
int mindis,u;
for(int i = 0; i < n; i++)
{
dist[i] = Map[Start][i];
vis[i] = 0;
///原来这里忘判断了,直接就是maxscore[i] = score[Start]+score[i],死活过不去第二组数据。太粗心了。
if(i != Start)
maxscore[i] = score[Start]+score[i];
else
maxscore[i] = score[Start];
}
vis[Start] = 1;
for(int i = 0; i < n; i++)
{
mindis = inf;
for(int j = 0; j < n; j++)
{
if(vis[j]==0)
{
if(dist[j]<mindis)
{
u = j;
mindis = dist[j];
}
}
}
vis[u] = 1;
for(int j = 0; j < n; j++)
{
if(vis[j]==0 && Map[u][j]!=inf)
{
if(dist[u]+Map[u][j]<dist[j]) ///首先保证路径最短
{
dist[j] = dist[u] + Map[u][j];
maxscore[j] = maxscore[u]+score[j];
}
if(dist[u]+Map[u][j]==dist[j]) ///最短路长度一样,取分数大的。
{
if(maxscore[u]+score[j]>maxscore[j])
maxscore[j] = maxscore[u]+score[j];
}
}
}
}
}
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&Start,&End)) ///n个房间,m条道路,Start起点,End终点
{
for(int i = 0; i < n; i++)
scanf("%d",&score[i]); ///输入n个房间对应的分数
initMap();
while(m--)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Map[x][y] = Map[y][x] = z; ///耗费的时间。
}
dijkstra();
printf("%d %d\n",dist[End],maxscore[End]);
}
return 0;
}