程序基本算法习题解析 n个超市,两名警察,当某个超市发现小偷后,两名警察中距离该超市耗时最短的人将到达超市进行抓捕,求最坏情况下抓住小偷的警察蹲守方案。

题目:

现在共有n个超市,每个超市都有监视设施,超市之间通过街道相连。只有A和B两名警察,他们分别守候在两个不同的超市,当某个超市发现小偷后,警察A和警察C中距离该超市耗时最短的人将到达超市进行抓捕,要求输出在最坏的情况下能尽快抓住小偷的方案(即警察A和B应守候在哪个超市)。输入的第一行为一个整数n(n<=100),表示超市数,接下来输入若干行,每行3个整数f,v,t,表示超市f到超市v之间经过街道花费的时间t(t<=100)(注意:方向是双向的,即超市v到超市f所需的时间也为t)。输出一行,包括两个不同的整数x和y,分别代表两名警察守候的超市。

思路:

题中限制超市个数最多为100,因此可通过枚举两个警察所在的超市,对每个枚举方案,求两个警察到各个超市时间的最小值,然后取所有最小值中的最大值,得到这种方案最坏情况下需要的时间。最后对每种方案最坏情况所需时间进行比较,得到一个最坏情况下的最小值,即可得出满足题意的最理性位置。

代码如下:

// Chapter12_5.cpp : Defines the entry point for the application.
// 捉住小偷
// 现在共有n个超市,每个超市都有监视设施,超市之间通过街道相连。只有A和B两名警察,
// 他们分别守候在两个不同的超市,当某个超市发现小偷后,警察A和警察C中距离该超市
// 耗时最短的人将到达超市进行抓捕,要求输出在最坏的情况下能尽快抓住小偷的方案
// (即警察A和B应守候在哪个超市)
// 输入的第一行为一个整数n(n<=100),表示超市数
// 接下来输入若干行,每行3个整数f,v,t,表示超市f到超市v之间经过街道花费的时间t(t<=100)
// 注意:方向是双向的,即超市v到超市f所需的时间也为t
// 输出一行,包括两个不同的整数x和y,分别代表两名警察守候的超市

#include "stdafx.h"
#include<iostream>
using namespace std;

int main()
{
	int n; //超市数量
	int i,j;
	int f,v,temp; //f,v:超市编号,temp:超市f到超市t所花的时间
	int x,y; //两个警察守候的位置
	cout << "输入超市数:";
	cin >> n;
	//动态分配二维数组t,存放两两超市之间行走需要的时间
	int **t = new int *[n+1];
	for(i=0;i<=n;i++)
		t[i] = new int[n+1];
	//按题目要求输入
	cout << "每行输入3个整数,分别为超市f,超市v,以及f到v之间花费的时间:" << endl;
        //只需要输入n*(n-1)/2组数据(方向是双向的,且除去到自身的时间)
	for(i=1;i<=n*(n-1)/2;i++)
	{
		cin >> f >> v >> temp;
		//超市t到超市v所花的时间等于超市v到超市t所花的时间
		t[f][v] = temp;
		t[v][f] = temp;
	}
	//同一个超市之间的时间设为0
	for(i=1;i<=n;i++)
		t[i][i] = 0;
	//以下两个变量的计算是在确定两个警察蹲守的位置情况下
	//temp_t:当小偷在某个超市时,耗时最短的警察抓捕小偷需要的时间
	//max_t:遍历所有超市,在最坏情况下警察抓捕小偷需要的时间(temp_t的最大值)
	int temp_t,max_t;
	//worst_t:最坏情况下警察抓捕小偷需要的时间(遍历所有可能的警察蹲守位置)
	//设一个很大的值即可
	int worst_t = 9999;
	//final_x,final_y:警察的蹲守方案
	int final_x,final_y;
	for(x=1;x<=n;x++)
	{
		for(y=1;y<=n;y++)
		{
			max_t = 0;
			for(i=1;i<=n;i++)
			{
				//当小偷在超市i时,耗时最短的警察所用的时间
				temp_t = min(t[x][i],t[y][i]);
				//遍历所有超市,计算在最坏情况下抓住小偷的时间
				max_t = max(temp_t,max_t);
			}
			//对警察可能的蹲守位置进行分析比较,找到最坏情况下抓住小偷的最少时间及确定蹲守位置
			if(max_t < worst_t)
			{
				worst_t = max_t;
				final_x = x;
				final_y = y;
			}
		}
	}
	cout << "两个警察守候的超市编号分别为:" << endl;
	cout << "x= " << final_x << ", y= " << final_y << endl;
	//释放空间
	for(i=0;i<=n;i++)
	{
		delete t[i];
		t[i] = NULL;
	}
	delete [n+1]t;
	t = NULL;
	system("pause");
	return 0;
}

运行结果如下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值