日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NYOJ 115 城市平乱(图论Dijkstra)

發布時間:2025/3/16 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NYOJ 115 城市平乱(图论Dijkstra) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

城市平亂

時間限制:1000 ms ?|? 內存限制:65535 KB 難度:4 描述

南將軍統領著N個部隊,這N個部隊分別駐扎在N個不同的城市。

他在用這N個部隊維護著M個城市的治安,這M個城市分別編號從1到M。

現在,小工軍師告訴南將軍,第K號城市發生了暴亂,南將軍從各個部隊都派遣了一個分隊沿最近路去往暴亂城市平亂。

現在已知在任意兩個城市之間的路行軍所需的時間,你作為南將軍麾下最厲害的程序員,請你編寫一個程序來告訴南將軍第一個分隊到達叛亂城市所需的時間。

注意,兩個城市之間可能不只一條路。

輸入
第一行輸入一個整數T,表示測試數據的組數。(T<20)
每組測試數據的第一行是四個整數N,M,P,Q(1<=N<=100,N<=M<=1000,M-1<=P<=100000)其中N表示部隊數,M表示城市數,P表示城市之間的路的條數,Q表示發生暴亂的城市編號。
隨后的一行是N個整數,表示部隊所在城市的編號。
再之后的P行,每行有三個正整數,a,b,t(1<=a,b<=M,1<=t<=100),表示a,b之間的路如果行軍需要用時為t

數據保證暴亂的城市是可達的。
輸出
對于每組測試數據,輸出第一支部隊到達叛亂城市時的時間。每組輸出占一行
樣例輸入
1 3 8 9 8 1 2 3 1 2 1 2 3 2 1 4 2 2 5 3 3 6 2 4 7 1 5 7 3 5 8 2 6 8 2
樣例輸出
4

分析:由于最終每個城市的軍隊都要到達暴亂城市,所以我們可以選擇暴亂城市作為Dijkstra算法的源點,即求暴亂城市到各個城市的最短路

#include<string.h> #include<stdio.h> #define INF 9999999 using namespace std; ///迪杰斯特拉最短路 int Map[1005][1005];///存儲地圖數據 int dis[1005];///存儲距離 int vis[1005];///已走過的點標記為1,初始化為0void Dijsktra(int s, int N) ///從原點s到其他N-1個點的距離 {for(int i=1; i<=N; i++) ///初始化距離數組dis[i]=Map[s][i];vis[s]=1;///s到各點距離,所以s已經被訪問int minn,u;///輔助變量for(int i=1; i<=N-1; i++) ///迪杰斯特拉核心語句{minn=INF;for(int j=1; j<=N; j++){if(vis[j]==0&&dis[j]<minn){minn=dis[j];u=j;}}vis[u]=1;///標記為已訪問for(int v=1; v<=N; v++){if(Map[u][v]<INF){if(dis[v]>dis[u]+Map[u][v])dis[v]=dis[u]+Map[u][v];///松弛完成}}} }int main() {int K;scanf("%d",&K);while(K--){int n, m, p, q;int army[105];scanf("%d%d%d%d", &n, &m, &p, &q);for(int i=0; i<n; i++)scanf("%d", &army[i]);for(int i=0; i<1005; i++) ///初始化{for(int j=0; j<1005; j++){if(i==j) Map[i][j] = 0;else Map[i][j] = INF;}}for(int i=0; i<p; i++){int a, b, t;scanf("%d%d%d", &a, &b, &t);if(t<Map[a][b]) {Map[a][b] = t;Map[b][a] = t;}}memset(vis,0,sizeof(vis));///已訪問的標記為1Dijsktra(q, m);int minx = INF;for(int i=0; i<n; i++){if(dis[army[i]]<minx) minx = dis[army[i]];}printf("%d\n", minx);}return 0; }



總結

以上是生活随笔為你收集整理的NYOJ 115 城市平乱(图论Dijkstra)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。