题目:
现在共有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;
}
运行结果如下: