1. 程式人生 > 其它 >1072 Gas Station (30分)(dijkstra)

1072 Gas Station (30分)(dijkstra)

技術標籤: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; }