zoukankan      html  css  js  c++  java
  • 1459 迷宫游戏(51NOD)

    你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数。
    还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间。游戏规定了你的起点和终点房间,
    你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大。现在问题来了,给定房间、道路、
    分数、起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么?

    Input:

    第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道
    路,start和end表示起点和终点房间的编号。
    第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
    再接下来m行,每行3个空格分隔的整数x, y, z (0 输入保证从start到end至少有一条路径。

    Output:

    一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。

    Sample Input:

    3 2 0 2
    1 2 3
    0 1 10
    1 2 11
    Sample Output:

    21 6

    思路:

    最短路径,只不过多保存一个数据。

    坑点:

    1.注意不要形成两个0之间的死循环。

    2.当路径长度相同时,如果分数更新点也要判断入队。(我在这卡了一个小时。。。。。)


    代码:

    #include<iostream>
    #include<stdio.h>
    #include<queue>
    #include<cstring>
    
    using namespace std;
    
    #define INF 10000700000000
    
    int N,M,S,E;
    
    long long score[505];
    long long map[505][505];
    long long len[505][2];
    
    
    bool book[505];
    void Spfa() {
    	for(int i=0 ; i<=N ; i++){
    		len[i][0] = INF;
    		len[i][1] = 0;
    	}
    	len[S][0] = 0;
    	len[S][1] = score[S];
    	queue<int>Q;
    	Q.push(S);
    	book[S] = true;
    	while(!Q.empty()){
    		int mid = Q.front();
    		Q.pop();
    		book[mid] = false;
    		for(int j=0 ; j<N ; j++ ){
    			if(map[mid][j] == INF)continue;
    			if(len[j][0]>len[mid][0]+map[mid][j]){
    				len[j][0] = len[mid][0] + map[mid][j];
    				len[j][1] = len[mid][1] + score[j];
    				if(book[j] == false){
    					book[j] = true;
    					Q.push(j);
    				} 
    			}
    			else if(len[j][0] == len[mid][0]+map[mid][j]){
    				if(len[j][1]<len[mid][1]+score[j]){
    					len[j][1] = len[mid][1]+score[j];
    					if(book[j] == false){
    						book[j] = true;
    						Q.push(j);
    					}
    				}
    			} 
    		}
    	}
    }
    
    int main(){
    	scanf("%d %d %d %d",&N,&M,&S,&E);
    	for(int i=0 ; i<=N ; i++)
    		for(int j=0 ; j<=N ; j++)
    			map[i][j] = INF;
    	for(int i=0 ; i<N ; i++)scanf("%lld",&score[i]);
    	while(M--){
    		int a,b;
    		long long c;
    		scanf("%d %d %lld",&a,&b,&c);
    		map[a][b] = map[b][a] = c;
    	}
    	Spfa();
    	printf("%lld %lld
    ",len[E][0],len[E][1]);
    	return 0;
    }


  • 相关阅读:
    【Oracle】安装
    【Java】String,StringBuffer与StringBuilder的区别??
    【Java】基本数据类型长度
    静态构造函数
    【算法】递归算法
    【JavaScript】JavaScript教程之------------------JavaScript实现
    【Android】listview优化
    【JAVA EE企业级开发四步走完全攻略】
    Eclipse下Tomcat插件的安装
    Android工具
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514296.html
Copyright © 2011-2022 走看看