题意是:在一个城市里有一些消防站,但是市民抱怨这些消防站离他们太远了,希望政府能新建一些消防站,让他们离这些新建的消防站比原有的消防站近一些。
思路:可以利用Floyd求出各点之间的最短距离,然后枚举每个点,若该点比原有的点的最大值要小,则更新,直至最小
#include <iostream> #include <cstdio> #include <cstring> #define min(a,b) a<b?a:b #define max(a,b) a>b?a:b #define inf 9999999 #define maxn 512 using namespace std; int map[maxn][maxn]; int firehouse[maxn]; int firewight[maxn]; int node,renode; void init() { for(int i=0;i<maxn;i++) { for(int j=0;j<maxn;j++) { map[i][j]=inf; } map[i][i]=0; } } void Floyd() { int i,k,j; for(k=1;k<=node;k++) for(i=1;i<=node;i++) for(j=1;j<=node;j++) map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } void solve() { scanf("%d %d",&renode,&node); for(int i=1;i<=renode;i++) { scanf("%d",&firehouse[i]); } init(); int st,end,val; while(scanf("%d %d %d",&st,&end,&val)!=EOF) { if(map[st][end]>val) map[st][end]=map[end][st]=val; } Floyd(); int remin=0,temp; for(int i=1;i<=node;i++) { temp=inf; for(int j=1;j<=renode;j++) { temp=min(temp,map[i][firehouse[j]]); } firewight[i]=temp; if(remin<firewight[i]) remin=firewight[i]; } int ansidx=1,maxnu; for(int i=1;i<=node;i++) { maxnu=0; for(int j=1;j<=node;j++) { if(map[i][j]<firewight[j]) { maxnu=max(maxnu,map[i][j]); }else { maxnu=max(maxnu,firewight[j]); } } if(maxnu<remin) { remin=maxnu; ansidx=i; } } printf("%d\n",ansidx); } int main() { solve(); return 0; }