消防站
题目链接:Click Here~
题意分析:
就是给你f个消防站,n个路口。要你求出在已有消防站的基础上在n个路口的哪个路口上在建立一个消防站,使得n个路口的到离自己最近的消防站最近的距离中最大的一个值最小。即:求n个最近路口中最大的一个,使其改最大值最小。详细的要求自己看题目吧~
算法分析:
因为,是n个路口到每个消防站的距离。所以,我们可以想到先用一次Flody算法。把每两点的最近距离给算出来。之后在枚举N个路口,进行判断比较得出答案。
#include <iostream>
#include <algorithm>
#include <sstream>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = ~0U >> 2;
const int MAXN = 500+10;
int G[MAXN][MAXN],fire[MAXN];
void Flody(int n)
{
for(int k = 1;k <= n;++k)
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j)
if(G[i][k] != INF&&G[k][j] != INF)
G[i][j] = min(G[i][j],G[i][k]+G[k][j]);
}
int main()
{
int T,f,n;
cin>>T;
while(T--)
{
int x;
scanf("%d%d",&f,&n);
memset(fire,0,sizeof(fire));
for(int i = 0;i < f;++i){
cin>>x;
fire[x] = 1;
}
cin.ignore();
string line;
int u,v,w;
istringstream iss;
for(int i = 0;i <= n;++i)
for(int j = 0;j <= n;++j)
G[i][j] = (i==j?0:INF);
while(getline(cin,line),line.length()>0){
iss.clear();
iss.str(line);
iss>>u>>v>>w;
G[u][v] = G[v][u] = w;
}
Flody(n);
int minrode = INF,ans = 1;
int maxrode,shortest;
for(int i = 1;i <= n;++i){ /*//在第i个路口建消防站的结果*/
maxrode = 0;
for(int j = 1;j <= n;++j){ /*//在第i个路口建消防站后的最长距离*/
shortest = INF;
for(int k = 1;k <= n;++k){
if(!fire[k]&&k != i)continue; /*//即不是已有的消防站也不是要建立的消防站路口*/
shortest = min(shortest,G[j][k]);
}
maxrode = max(maxrode,shortest);
}
if(maxrode < minrode){
minrode = maxrode;
ans = i;
}
}
cout<<ans<<endl;
if(T)cout<<endl;
}
return 0;
}