1003. Emergency

原创 2015年11月20日 15:55:30

1003. Emergency (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pair of cities are marked on the map. When there is an emergency call to you from some other city, your job is to lead your men to the place as quickly as possible, and at the mean time, call up as many hands on the way as possible.

Input

Each input file contains one test case. For each test case, the first line contains 4 positive integers: N (<= 500) - the number of cities (and the cities are numbered from 0 to N-1), M - the number of roads, C1 and C2 - the cities that you are currently in and that you must save, respectively. The next line contains N integers, where the i-th integer is the number of rescue teams in the i-th city. Then M lines follow, each describes a road with three integers c1, c2 and L, which are the pair of cities connected by a road and the length of that road, respectively. It is guaranteed that there exists at least one path from C1 to C2.

Output

For each test case, print in one line two numbers: the number of different shortest paths between C1 and C2, and the maximum amount of rescue teams you can possibly gather.
All the numbers in a line must be separated by exactly one space, and there is no extra space allowed at the end of a line.

Sample Input
5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
Sample Output
2 4
题目的意思就是一张图,各边都有权值而且个点也有权值,求出给定两点之间最短路的条数并输出此路径上的点权值和的最大值。就是求出最短路的条数,若有多条相同的最短路输出最大的那个点权值和。很简单的题目,一个dfs就可以很好的解决掉。当然这个题目还可以继续增加点复杂度,就是把各条最短路的路径打印出来,这个也是很好实现的,加个pre数组,然后可以再来个dfs,当然也可以先来遍迪杰斯特拉。下面我们采用这两种方法来做,代码一:迪杰斯特克拉,代码而:dfs,当然用bfs也是可以做的,你也可以自己试一试。
代码一:迪杰斯特拉
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

int path[502][502];
int d[502];
int exist[502];
int rescue[502];
int cnt[502], r[502];

int n, m, s, e;

int max(int a, int b)
{
	return a > b ? a : b;
}

int nearest()
{
	int max = INT_MAX;
	int index;
	
	for(int i = 0; i < n; i ++)
	{
		if(!exist[i] && d[i] < max)
		{
			max = d[i];
			index = i;
		}
	}
	return index;
}

void shortest()
{
	exist[s] = 1;
	
	for(int i = 0; i < n; i ++)
	{
		d[i] = path[s][i];
		cnt[i] = (d[i] == INT_MAX) ? 0 : 1;
		r[i] = (d[i] == INT_MAX) ? INT_MIN : rescue[i] + rescue[s];
	}
	
	r[s] = rescue[s];
	d[s] = 0;
	cnt[s] = 1;
	
	for(int i = 0; i < n-1; i ++)
	{
		int index = nearest();
		exist[index] = 1;
		
		for(int j = 0; j < n; j ++)
		{
			if(exist[j] || path[index][j] == INT_MAX)
				continue;
			
			if(d[index] + path[index][j] < d[j])
			{
				d[j] = d[index] + path[index][j];
				cnt[j] = cnt[index];
				r[j] =r[index] + rescue[j];
			} 
			else if(d[index] + path[index][j] == d[j])
			{
				cnt[j] += cnt[index];
				r[j] = max(r[index]+rescue[j], r[j]);
			}
		}
	}
	printf("%d %d\n", cnt[e], r[e]);
}

int main()
{
	freopen("E://input.txt", "r", stdin);

	
	scanf("%d%d%d%d", &n, &m, &s, &e);
	
	for(int i = 0; i < n; i ++)
	{
		for(int j = 0; j < n; j ++)
			path[i][j] = INT_MAX;
	}
	
	for(int i = 0; i < n; i ++)
		scanf("%d", &rescue[i]);
	
	for(int i = 0; i < m; i ++)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		scanf("%d", &path[a][b]);
		path[b][a] = path[a][b];
	}
	
	shortest();
	return 0;
}



代码二:bfs
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

int rescue[502], exist[502], map[502][502];

int mind, cnt, maxt, n;//cnt记录有多少条最短路径,maxt记录多条相同的最短路中最大的那个各城市的救援队数量 

void init(int n)
{
	for(int i = 0; i < n; i ++)
	{
		exist[i] = 0;
		for(int j = 0; j < n; j ++)
			map[i][j] = INT_MAX;
	}
}


void dfs(int p, int end, int dist, int numt)
{
	if(p == end)
	{
		if(dist < mind)
		{
			cnt = 1;
			mind = dist;
			maxt = numt;
		}
		else if(dist == mind)
		{
			cnt ++;
			if(maxt < numt)
				maxt = numt;
		}
		
		return ;
	}
	
	if(dist > mind)
		return ;//这个地方不剪枝的话最后一个case过不去的
	
	for(int i = 0; i < n; i ++)
	{
		if(exist[i] == 0 && map[p][i] != INT_MAX)
		{
			exist[i] = 1;
			dfs(i, end, dist+map[p][i], numt+rescue[i]);
			exist[i] = 0;
		}
	} 
}

int main()
{
	freopen("E://input.txt", "r", stdin);
	int m, st, end, x, y, d;
	mind = INT_MAX;
	cnt = 0;
		
	scanf("%d%d%d%d", &n, &m, &st, &end);
	init(n);
	for(int i = 0; i < n; i ++)
		scanf("%d", &rescue[i]);
			
	while(m --)
	{
		scanf("%d%d%d", &x, &y, &d);
		if(map[x][y] > d)
			map[x][y] = map[y][x] = d;
	}
		
	dfs(st, end, 0, rescue[st]);
	printf("%d %d\n", cnt, maxt);
		
	return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

PAT 1003. Emergency (25) (求两点间最短路的条数)

1003. Emergency (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 ...
  • IAccepted
  • IAccepted
  • 2014年03月18日 12:19
  • 7772

1003. Emergency(最短路)

As an emergency rescue team leader of a city, you are given a special map of your country. The map s...
  • dengkuomin
  • dengkuomin
  • 2017年03月23日 20:46
  • 79

解决Ubuntu启动时出现“welcome to emergency mode”的问题

问题描述: 我用的是Windows 10 和Ubuntu16.04,每次在Windows中关机然后再开机进入Ubuntu中会出现“”welcome to emergnecy mode“”的问题,但是...
  • Nicholas_Wong
  • Nicholas_Wong
  • 2017年04月13日 14:23
  • 1438

1003. Emergency (25):简单最短路径问题

#include #include using namespace std; #define INFINITY 21474843649 #define MaxSize 500 int Map[Max...
  • qq_17249047
  • qq_17249047
  • 2015年06月06日 11:11
  • 228

1003. 我要通过!

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。 得到“答案正确”的条件是: ...
  • chr1991
  • chr1991
  • 2016年02月05日 14:30
  • 453

【学习笔记】〖PAT〗1003. Emergency (25)

路,DFS函数传递引用参数来记录已经找到的最短路径和当前最多救援队数目,然后递归调用DFS。在DFS过程中如果当前长度curLen大于已知最短路径可以直接进行剪枝。 函数定义如下 //参数:起始位置,...
  • j597960549
  • j597960549
  • 2014年03月22日 19:38
  • 729

ubuntu 16.04开机进入emergency mode的一种可能

今日开机后突然进入emergency mode,胡乱折腾一通,终于找到问题所在,查阅资料后终于解决了问题。 起因:电脑是win10+ubuntu双系统,前一日在win10上运行虚拟机做实验时,突...
  • Flora_C
  • Flora_C
  • 2016年12月02日 16:02
  • 3215

PAT中文版1003.我要通过!

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。 得到“答案正确”的条件是: ...
  • huowei55090521
  • huowei55090521
  • 2013年03月14日 21:29
  • 5523

[PAT]1003. 我要通过!(20)

1003. 我要通过!(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN,...
  • zhouhuakang
  • zhouhuakang
  • 2016年02月27日 17:46
  • 3708

Ubuntu 15.04 开机无法进入图形界面,自动进入emergency mode解决方法

注:该问题可能由于不同的原因所致,楼主只是介绍自己的经验之谈,也即鄙人所遇到的情况。 某些情况下无法进入ubuntu 15.04 的图形界面,界面提示 GIVE root password ...
  • ariera
  • ariera
  • 2015年09月28日 14:26
  • 8657
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1003. Emergency
举报原因:
原因补充:

(最多只允许输入30个字)