PAT 甲级 1072 Gas Station

题意:比较常规的一题,想复杂了,提醒自己一定要注意读题,求到每个村庄的最短距离的最远也即最大值,若不唯一,选择平均距离最小的那一条,仍然不唯一选择id最小的一个

思路:每次用dijkstar算法求出从加油站到每个村庄的最小值,注意如果超过阈值或者是不相邻就抛弃该地点,而且加油站点中也要算在路径里面去最值,每次算出最小值之后要与之前的数据比较选择是否更新

注意点:

1.输出的时候用a和b临时接受输入数据,这样就不用每次都转化了;加油站索引中包含数字而且有序直接使用就好了,不用新返回一个索引

2.在统计总的和的时候同样也可以计算最小距离

代码:

#include
#include
#include
#define nodes 1020
#define INF 65536
using namespace std;
int g[nodes][nodes] = { 0 },D[nodes];
int n, m, k, ds, ansid = -1, u, v;
bool vis[nodes];
double ans = -1, avedis = 9999999;
void dijkstar(int start) {
	fill(vis, vis + nodes, false);
	fill(D, D + nodes, INF);
	D[start] = 0;
	for (int i = 1; i <= n+m; i++) {
		u = -1, v = INF;
		for (int j = 1; j <= n + m; j++) {
			if (D[j] < v&&vis[j] == false) {
				v = D[j], u = j;
			}
		}
		if (u == -1)break;
		vis[u] = true;
		for (int v = 1; v <= n + m; v++) {
			if (vis[v] == false && g[u][v] != INF) {
				if (D[u] + g[u][v] < D[v]) {
					D[v] = D[u] + g[u][v];
				}
			}
		}
	}
	double minDis = D[1], aveDis = 0;
	for (int i = 1; i <= n; i++) {//找到所有的路径的和,顺序检查到加油站的距离是否超过了最大的阈值
		if (D[i] > ds)return;
		if (D[i] < minDis) minDis = D[i];//查看所有的值的最小值
		aveDis += D[i];
	}
	aveDis /= n;
	if (minDis > ans) {//找到最短路径的最大值
		ans = minDis;
		ansid = start;
		avedis = aveDis;
	}else if (minDis == ans && aveDis < avedis) {//如果最短路径相等,则选择最小的平均路径最短的那一条,,
		ansid = start;// ansid一直保存的最小的id,除非有更远的最小路径或者是有更小的平均距离,否则相等也不更新
		avedis = aveDis;
	}
}
int main() {
	fill(g[0] , g[0] + nodes*nodes, INF);
	string s1, s2;
	cin >> n >> m >> k >> ds;
	for (int i = 0; i < k; i++) {//构建图
		int cost;
		cin >> s1 >> s2 >> cost;
		int id1 = -1, id2 = -1;
		if (s1[0] < '1' || s1[0] > '9') {
			id1 = stoi(s1.substr(1)) + n;
		}else {
			id1 = stoi(s1);
		}
		if (s2[0] < '1' || s2[0] > '9') {
			id2 = stoi(s2.substr(1)) + n;
		}else {
			id2 = stoi(s2);
		}
		g[id1][id2] = cost;
		g[id2][id1] = cost;
	}
	for (int i = n+1; i <= n+m; i++) {
		dijkstar(i);
	}
	if (ansid==-1){
		printf("No Solution\n");
	}else {
		printf("G%d\n", ansid - n);
		printf("%.1lf %.1lf\n",ans, avedis);
	}
	system("pause");
	return 0;
}

 

你可能感兴趣的:(dijkstar算法,图的相关问题,PAT之dijkstar算法)