PAT甲级1003 Emergency:[C++题解]dijkstra求最短路、最短路条数
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1003 Emergency:[C++题解]dijkstra求最短路、最短路条数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
分析:求單源最短路,使用dijkstra()算法。
最短路的條數(shù),和最短路中 人數(shù)最多的一條,輸出最多人數(shù)。
本題點(diǎn)比較少,使用鄰接矩陣d[N][N]來(lái)存。
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 510;int n, m , S, T; int d[N][N]; int w[N]; //點(diǎn)權(quán) int dist[N]; //最短路 int cnt[N];//最短路的數(shù)量 int sum[N]; // 人數(shù)求和bool st[N]; //是否求出過(guò)最短路void dijkstra(){memset(dist, 0x3f , sizeof dist); // 距離初始化dist[S] = 0; // cnt[S] = 1; //初始化:從起點(diǎn)出發(fā)的路徑只有一種sum[S] =w[S];//起點(diǎn)的點(diǎn)權(quán)是w[S]for(int i = 0 ;i< n; i++){int t = -1;for(int j = 0 ;j<n; j++){if(!st[j] &&(t== -1 || dist[j]< dist[t]))t = j;}st[t] =true;for(int j =0 ;j<n; j++){//最短路唯一if(dist[j] >dist[t] + d[t][j]){dist[j] =dist[t] +d[t][j];cnt[j] =cnt[t]; //到j(luò)的最短路數(shù)量 = 到t的最短路數(shù)量sum[j] = sum[t] + w[j]; // 最大人數(shù)更新}//最短路不唯一,合并else if( dist[j] == dist[t] +d[t][j]){cnt[j] += cnt[t]; //最短路數(shù)量合并sum[j] = max(sum[j] , sum[t] + w[j]); //最大人數(shù)更新}}} } int main(){cin >> n >> m >> S >> T;for(int i =0 ; i< n; i++) cin>> w[i];memset(d, 0x3f, sizeof d); //鄰接矩陣初始化 while(m--){int a, b, c;cin >> a >> b >> c;d[a][b] =d[b][a] = min(d[a][b] ,c); //讀入距離,讀入最小的一條}dijkstra();//輸出 最短路數(shù)量,最大人數(shù)cout<< cnt[T] <<" "<<sum[T]<<endl; }題目鏈接
PAT甲級(jí)1003 Emergency
ACWING1475. 緊急情況
總結(jié)
以上是生活随笔為你收集整理的PAT甲级1003 Emergency:[C++题解]dijkstra求最短路、最短路条数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PAT甲级1094 The Larges
- 下一篇: PAT甲级1030 Travel Pla