zoukankan      html  css  js  c++  java
  • 51Nod 1459:迷宫游戏(最短路)

                                    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
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <limits.h>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <set>
    #include <string>
    #define ll long long
    #define ms(a) memset(a,0,sizeof(a))
    #define Ms(a) memset(a,INF,sizeof(a))
    #define pi acos(-1.0)
    #define INF 0x3f3f3f3f
    const double E=exp(1);
    const int maxn=1e3+10;
    using namespace std;
    int flag[maxn];
    int way[maxn][maxn];
    int dis[maxn];
    int point[maxn];
    int gg[maxn];
    int n,m;
    void Dijkstra(int v)
    {
    	memset(flag,0,sizeof(flag));
    	int ans,x;
    	gg[v]=point[v];
    	for(int i=0;i<n;i++)
    	{
    		if(way[v][i]<INF)
    			gg[i]=point[v]+point[i];
    		dis[i]=way[v][i];
    	}
    	dis[v]=0;
    	flag[v]=1;
    	for(int i=1;i<n;i++)
    	{
    		x=0;
    		ans=INF;
    		for(int j=0;j<n;j++)
    		{
    			if(ans>dis[j]&&!flag[j])
    			{
    				ans=dis[j];
    				x=j;
    			}
    		}
    		flag[x]=1;
    		for(int j=0;j<n;j++)
    		{
    			if(!flag[j]&&dis[j]>way[x][j]+dis[x])
    			{
    				dis[j]=way[x][j]+dis[x];
    				gg[j]=gg[x]+point[j];
    			}
    		}
    		for(int j=0;j<n;j++)
    		{
    			if(dis[j]==way[x][j]+dis[x])
    				gg[j]=max(gg[j],gg[x]+point[j]);
    		}
    	}
    }
    int main(int argc, char const *argv[])
    {
    	ios::sync_with_stdio(false);
    	int start,end;
    	cin>>n>>m>>start>>end;
    	int x,y,z;
    	ms(gg);
    	for(int i=0;i<n;i++)
    		cin>>point[i];
    	Ms(way);
    	while(m--)
    	{
    		cin>>x>>y>>z;
    		way[x][y]=way[y][x]=min(way[x][y],z);
    	}
    	Dijkstra(start);
    	cout<<dis[end]<<" "<<gg[end]<<endl;
    	return 0;
    }
    
  • 相关阅读:
    HDU 1505 City Game
    HDU 1506 Largest Rectangle in a Histogram
    HDU 1838 Chessboard
    HDU 2512 一卡通大冒险
    HDU 1081 To The Max
    HDU 2845 Beans
    HDU 1422 重温世界杯
    HDU 1231 最大连续子序列
    第6章 接口和实现
    java面向抽象编程样例
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324382.html
Copyright © 2011-2022 走看看