PAT甲级1072 Gas Station (30 分):[C++题解]dijkstra算法、最短路
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1072 Gas Station (30 分):[C++题解]dijkstra算法、最短路
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目來源
題目分析
來源:acwing
分析:
所有的dist[ ]都≤Ds;最小的dist[ ]最大; dist[ ] 總和最大。
由于加油站是字符,為了簡單起見,將m個加油站編號為n+1 ~n+m。
然后就是dijkstra算法的板子。
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 1020,INF = 0x3f3f3f3f; int n, m, k , D;int g[N][N]; int dist[N]; bool st[N];int get(string s){if(s[0]=='G') return n+stoi(s.substr(1));return stoi(s); }void dijkstra(int start, int &mind , int & sumd){memset(dist ,0x3f, sizeof dist);memset(st,0,sizeof st);dist[start] = 0;for(int i = 0; i< n+ m; i++){int t = -1;for(int j =1; j<= n +m; j++){if(!st[j] && (t== -1 || dist[j]<dist[t])) t = j;}st[t] = true;for(int j = 1; j<= n + m; j ++){dist[j] = min(dist[j] ,dist[t]+g[t][j]);}}for(int i =1; i<= n;i ++)if(dist[i] > D) {mind = -INF;return;}mind = INF, sumd = 0;for(int i =1; i<= n; i++ ){mind = min(mind ,dist[i]);sumd += dist[i];} } int main(){cin >> n >> m >> k >> D;memset(g, 0x3f,sizeof g);while(k--){string a,b;int z;cin >> a>> b>> z;int x = get(a) ,y = get(b);g[x][y] = g[y][x] = min(g[x][y],z);}int res= -1;//加油站int mind= 0;//最小值的最大值int sumd = INF;//總和的最小值for(int i= n+1; i<= n+m; i++){int d1 ,d2; //求mind和sumddijkstra(i ,d1 ,d2);if(d1 > mind ) res = i, mind = d1,sumd = d2;else if(d1 == mind && d2 < sumd) res = i,sumd = d2;}if(res == -1) puts("No Solution");else printf("G%d\n%.1lf %.1lf\n",res- n,(double) mind, (double)sumd/n + 1e-8); }題目來源
PAT甲級1072 Gas Station (30 分)
https://www.acwing.com/problem/content/1560/
總結
以上是生活随笔為你收集整理的PAT甲级1072 Gas Station (30 分):[C++题解]dijkstra算法、最短路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1089 Insert or
- 下一篇: PAT甲级1076 Forwards o