• PAT甲级1003. Emergency


    PAT甲级1003. Emergency

    题意:

    作为一个城市的紧急救援队长,你将得到一个你所在国家的特别地图。该地图显示了几条分散的城市,连接着一些道路。每个城市的救援队数量和任何一对城市之间的每条路线的长度在地图上标记。当你从其他城市发出紧急电话时,
    你的工作是尽快引导你的人到这个地方,同时在途中尽可能多的呼唤城市中的别的救援队。

    输入

    每个输入文件包含一个测试用例。对于每个测试用例,第一行包含4个正整数:N(<= 500) - 城市数量(城市编号从0到N-1),M - 道路数量C1和C2 - 你目前在的城市,你必须分别保存。下一行包含N个整数,其中i-
    整数是第i个城市的救援队数。然后M行跟随,每个描述一个具有三个整数c1,c2和L的道路,分别是通过道路连接的一对城市和该道路的长度。保证从C1到C2至少存在一条路径。

    输出

    对于每个测试用例,打印一行两个数字:C1和C2之间不同最短路径的数量以及可以收集的最大救援队数。
    一行中的所有数字必须分开一个空格,并且在行的末尾不允许额外的空格。

    思路:

    题意就是求city1到city2的单源最短路径,并且求出最短路径下能搜集最多救援队数量。

    ac代码:

    C++

    // pat1003.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    
    using namespace std;
    
    const int MAX = 0x7fffffff;
    
    int road[501][501];				//记录city间的距离
    int rescue[501];				//记录city的救援队
    int n, m;
    int starting, ending;
    int len[501];					//记录start到各个点的距离
    bool visit[501] = { false };	//保存已经遍历的点
    
    int main()
    {
    	cin >> n >> m >> starting >> ending;	
    	for (int i = 0; i < n; i++)
    		cin >> rescue[i];
    	
    	for (int i = 0; i < n; i++)
    	{
    		for (int j = 0; j < n; j++)
    		{
    			if (i == j) road[i][j] = 0;
    			else road[i][j] = MAX;
    		}
    	}
    
    	for (int i = 0; i < n; i++)
    		len[i] = MAX;
    
    	int c1,c2;
    	for (int i = 0; i < m; i++)
    	{
    		cin >> c1 >> c2;
    		cin	>> road[c1][c2];
    		road[c2][c1] = road[c1][c2];
    		if (c1 == starting) len[c2] = road[c1][c2];
    		if (c2 == starting) len[c1] = road[c1][c2];
    	}
    
    	int tempmin = MAX,tempindex;
    	int diffdis[501] = { 0 };				//记录有几种最短路径
    	diffdis[starting] = 1;				
    	len[starting] = 0;
    	int maxpeo[501] = { 0 };					//记录能搜集的最大救援队数量
    	maxpeo[starting] = rescue[starting];
    	while(1)
    	{
    		tempmin = MAX;
    		for (int i = 0; i < n; i++)
    		{
    			if (!visit[i] && len[i] < tempmin)
    			{
    				tempmin = len[i];
    				tempindex = i;
    			}
    		}
    
    		visit[tempindex] = true;
    
    		for (int i = 0; i < n; i++)
    		{
    			if (!visit[i] && road[tempindex][i] != MAX && tempmin + road[tempindex][i] < len[i])
    			{
    				len[i] = tempmin + road[tempindex][i];
    				diffdis[i] = diffdis[tempindex];
    				maxpeo[i] = maxpeo[tempindex] + rescue[i];
    			}
    			else if (!visit[i] && road[tempindex][i] != MAX &&  tempmin + road[tempindex][i] == len[i])
    			{
    				diffdis[i] += diffdis[tempindex];
    				maxpeo[i] = max(maxpeo[i], maxpeo[tempindex] + rescue[i]);
    			}
    		}
    
    		if (tempindex == ending) break;
    	}
    
    	cout << diffdis[ending] << " "  << maxpeo[ending] << endl;
        return 0;
    }
    
    
  • 相关阅读:
    netty入门
    zookeeper安装
    nginx
    链式调用方法的实现原理和方法
    UI设计篇·入门篇·简单动画的实现,为布局设置动画,用XML布置布局动画
    UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法
    UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转
    XML文档的生成和解析操作方法
    ListView的基本使用方法和RecyclerView的基本使用方法
    Fragment的粗浅理解
  • 原文地址:https://www.cnblogs.com/weedboy/p/7242140.html
Copyright © 2020-2023  润新知