PAT1072 Gas Station (30 分)

在这里插入图片描述
在这里插入图片描述

解析

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int INF = 0x3fffffff;
struct Node {
	int v, dis;
	Node() = default;
	Node(int _v,int _dis):v(_v),dis(_dis){}
};
vector<vector<Node>> G;
unordered_map<string, int> Gas2index;
unordered_map<int, string> index2Gas;
void Dijkstra(int s,vector<int>& d) {
	vector<bool> vis(G.size(), false);
	d.resize(G.size(), INF);
	d[s] = 0;
	for (int i = 1; i < G.size(); i++) {
		int u = -1, min = INF;
		for (int j = 1; j < G.size(); j++) {
			if (vis[j] == false && d[j] < min) {
				min = d[j];
				u = j;
			}
		}
		vis[u] = true;
		for (auto x : G[u]) {
			int v = x.v;
			if (vis[v] == false) {
				if (d[v] > d[u] + x.dis) {
					d[v] = d[u] + x.dis;
				}
			}
		}
	}
}
int main()
{
	int N, M, K, Ds;
	scanf("%d %d %d %d", &N, &M, &K, &Ds);
	G.resize(N + 1 + M); //1~N is house,N+1~N+M-1 is gas
	for (int i = 0; i < M; i++) {
		Gas2index[string("G") + to_string(i + 1)] = N + i + 1;
		index2Gas[N + i + 1] = string("G") + to_string(i + 1);
	}
	string c1, c2;
	int C1,C2,dis;
	for (int i = 0; i < K; i++) {
		cin >> c1 >> c2 >> dis;
		if (c1[0] == 'G')
			C1 = Gas2index[c1];
		else
			C1 = stoi(c1);
		if (c2[0] == 'G')
			C2 = Gas2index[c2];
		else
			C2 = stoi(c2);
		if (C1 != C2) {
			G[C1].push_back(Node(C2, dis));
			G[C2].push_back(Node(C1, dis));
		}
	}
	int index = -1;
	pair<int, double> data(-1,INF);   //min, average;
	for (int i = N + 1; i < N + M+1; i++) {
		vector<int> d;
		Dijkstra(i,d);
		int max = *max_element(d.begin() + 1, d.begin() + N + 1);
		if (max > Ds)
			continue;
		int min = *min_element(d.begin() + 1, d.begin() + N + 1);
		double avg = 0.0;
		for (auto it = d.begin() + 1; it != d.begin() + N + 1; it++)
			avg += *it;
		if (data.first < min) {
			data.first = min;
			data.second = avg;
			index = i;
		}
		else if (data.first == min && data.second > avg) {
				data.second = avg;
				index = i;
		}
	}
	if (index == -1)
		printf("No Solution");
	else 
		printf("%s\n%.1f %.1f", index2Gas[index].c_str(), (double)data.first, data.second/N);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41256413/article/details/84891519