1072 Gas Station (30分)(dijkstra)
阿新 • • 發佈:2021-01-31
技術標籤:PAT甲級# dijkstra演算法資料結構dijkstrac++
題目連結
思路
①求最短路徑,滿足最優子結構,即任意一條最短路徑中所包含的子路徑也是最短路徑,用dijkstra,來個貪心就夠了
②繼續分析,題目要求從多個加油站選擇一個最優,在程式碼實現上就是多次使用dijkstra演算法,剩下的就是一些細節處理了
程式碼
using namespace std;
//#include <iostream>
//#include<queue>
//#include<string>
//#include <iomanip>
#include<bits/stdc++.h>
int N, M, K, D, pro1,pro2, lenth;
double l, a ;
string start,dest;
int dis[1011], visited[1011], graph[1011][1011];
queue<int>result;
void dijkstra(int s) {
double lowest=0x3f3f3f3f, avg=0;
memset(dis, 0x3f, sizeof dis);
fill(visited, visited + 1011, 0);
dis[s] = 0;
for (int i = 0; i < N+M-1; i++ ) {
int min = 0x3f3f3f3f, index = -1;
for (int j = 1; j <= N+M; j++) {
if (dis[j] < min && !visited[j]) {
min = dis[j];
index = j;
}
}
if (index == -1)break;
visited[index] = 1;
for (int k = 1; k <= N+M; k++) {
if (!visited[k]&&dis[index]+graph[index] [k]<dis[k]) {
dis[k] = dis[index] + graph[index][k];
}
}
}
for (int i = 1; i <= N; i++) {
if (dis[i] > D)return;
avg += dis[i];
if (dis[i] < lowest) {
lowest = dis[i];
}
}
avg = avg / N;
if (lowest > l) {
a = avg;
l = lowest;
queue<int>().swap(result);
result.push(s);
}
else if (lowest == l) {
if (avg < a) {
a = avg;
queue<int>().swap(result);
result.push(s);
}
else if (avg == a) {
result.push(s);
}
}
}
int process(string n) {
int temp;
if (isalpha(n[0])) {
n = n.substr(1, n.size() - 1);
temp= stoi(n);
return temp + N;
}
else {
temp = stoi(n);
return temp;
}
}
int main() {
//-----------------------------初始化部分----------------------
//int N,M,K,D 如題中所給
//int lenth :兩個位置之間的距離
//int pro1,pro2 分別是 string start,dest處理後的位置
//int[][] graph,存圖
//int[] dis:從某個加油站到某個點的最短距離
//double l:從某個加油站出發到達居民房的最短距離
//double a:從某個加油站出發達到居民房的平均距離
//queue<int> result: 存滿足條件的加油站
cin >> N >> M >> K >> D;
memset(dis, 0x3f, sizeof dis);
memset(graph, 0x3f, sizeof graph);
for (int i = 0; i < K; i++) {
cin >> start >> dest >> lenth;
pro1 = process(start);
pro2 = process(dest);
graph[pro1][pro2] = graph[pro2][pro1] = lenth;
}
//-----------------------------多次呼叫dijkstra----------------
for (int i = 0; i < M; i++)dijkstra(N +i+1);
//-----------------------------結果處理------------------------
if (result.empty())cout << "No Solution";
else {
cout << "G" << result.front() - N << endl;
cout << fixed << setprecision(1) << l << " "<<a;
}
return 0;
}