51Nod 1459:迷宫游戏

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值