题意:N个居民房,M个加油站待建点,k条无向边。从M个加油站中选一个,使该加油站距离最近的居民房尽可能远,且必须保证所有房子与该加油站的距离都不超过给定的服务范围DS。如果有多个最近距离相同的解,选择平均距离最小的,如果平均距离相同,选择编号最小的。
分析:
1.输入可能是整数或者是Gn,所以要用字符串读入,根据首字符是否为‘G’判断如何处理编号。居民房1~N,加油站N+1~N+M。
2.最短距离可以经过加油站,故Dijkstra算法顶点编号范围1~N+M。
3.遍历每个加油站,得到一个d数组,寻找其中最小的值与平均距离。所有加油站中,第一标尺的最短距离,第二标尺是平均距离,由于是从小到大遍历加油站,第三标尺编号可以不考虑。
4.在Dijkstra算法中寻找最小值,计算平均距离(保存在全局变量中),若有一个居民房距离大于服务范围DS,返回-3。主函数中获得的返回值为-3时,continue,跳过接下来的比较步骤。
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
const int maxn = 1010;
const int INF = 100000;
struct Node {
int id;
int dis;
};
vector<Node>Adj[maxn];
int d[maxn]; //d[0]用于存储平均最短路径
bool mark[maxn]; //用于标记是否已加入最短距离顶点集合