zoukankan      html  css  js  c++  java
  • 51nod 1459 迷宫游戏 dijkstra模板

    链接:迷宫游戏 问题 - 51Nod  http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459
    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
     收藏
     关注
    你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数。还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间。游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大。现在问题来了,给定房间、道路、分数、起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么?
    Input
    第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道路,start和end表示起点和终点房间的编号。
    第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
    再接下来m行,每行3个空格分隔的整数x, y, z (0<z<=200)表示道路,表示从房间x到房间y(双向)的道路,注意,最多只有一条道路连结两个房间, 你需要的时间为z。
    输入保证从start到end至少有一条路径。
    Output
    一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。
    Input示例
    3 2 0 2
    1 2 3
    0 1 10
    1 2 11
    Output示例
    21 6
    这题就是dijkstra的模板题,只要增加一个从起点u到v的最大分值就可以了。
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define inf 0x3f3f3f
    int map[505][505],vis[505],dis[505],score[505],maxs[505];//maxs[i]表示 
    int n,m,k,t,start,end;                            //从起点到i点的最大分值,score记录每个点的输入分值 
    void init()
    {
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        map[i][j]=inf;
    }
    void dijkstra(int s)
    {
        for(int i=0;i<n;i++)
        {
            dis[i]=map[s][i];
            if(map[s][i]!=inf&&i!=s)
            maxs[i]=score[i]+score[s];//给maxs赋初始值 
            else
            maxs[i]=score[s];
        }
        dis[s]=0;
        vis[s]=1;
        for(int i=1;i<n;i++)
        {
            int min1=inf,u;
            for(int j=0;j<n;j++)
            {
                if(!vis[j]&&min1>dis[j])
                {
                    min1=dis[j];
                    u=j;
                }
            }
            vis[u]=1;
            for(int j=0;j<n;j++)
            {
                if(!vis[j])
                {
                    if(dis[j]==dis[u]+map[u][j])//如果松弛时距离相同,那么就把maxs更新为更大的 
                    maxs[j]=max(maxs[j],maxs[u]+score[j]);
                    else if(dis[j]>dis[u]+map[u][j])
                    {
                        dis[j]=dis[u]+map[u][j];
                        maxs[j]=maxs[u]+score[j];
                    }
                }
            }
            if(vis[end])
            return;
        }
    }
    int main()
    {
        while(scanf("%d%d%d%d",&n,&m,&start,&end)!=EOF)
        {
            init();
            for(int i=0;i<n;i++)
            {
                scanf("%d",&score[i]);
            }
            for(int i=0;i<m;i++)
            {
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                if(map[u][v]>w)
                map[u][v]=map[v][u]=w;
            }
            dijkstra(start);
            printf("%d %d
    ",dis[end],maxs[end]);
        }
        return 0;
    }
  • 相关阅读:
    B+树的Copy-on-Write设计
    so库链接和运行时选择哪个路径下的库?
    Xapian索引-文档检索过程分析之匹配百分比
    Xapian索引-文档检索过程分析
    Xapian的内存索引-添加文档
    Xapian的内存索引
    Xapian使用入门
    一个std::sort 自定义比较排序函数 crash的分析过程
    编译GCC4.8.2
    使用C++11的一点总结
  • 原文地址:https://www.cnblogs.com/6262369sss/p/9032787.html
Copyright © 2011-2022 走看看