51Nod 1459:迷宫游戏

来源:互联网 发布:报表软件排名 编辑:程序博客网 时间:2024/05/22 00:17

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459

最短路算法的小小拓展,给出起点终点,最起点到终点的最短路径中分数最大的那一条。

输出最短路和对应的最大分数。

基础入门题。


AC代码:

#include <iostream>#include <stdio.h>#include <vector>#define inf 0x3f3f3f3fusing 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;}


原创粉丝点击