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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

NYOJ 115 城市平乱

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

城市平亂

時間限制: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算法求解!
AC碼:
#include<stdio.h> #include<string.h> #define INF 999999999 int G[1010][1010],visit[1010],dist[1010]; int main() {int T,n,m,p,q,a,b,t,min,i,j,k;int army[105];scanf("%d",&T);while(T--){scanf("%d%d%d%d",&n,&m,&p,&q);// 輸入軍隊所在的頂點for(i=0;i<n;i++)scanf("%d",&army[i]);// 初始化鄰接矩陣for(i=0;i<=m;i++){for(j=0;j<=m;j++)G[i][j]=INF;}// 輸入可行的路徑及所需時間for(i=0;i<p;i++){scanf("%d%d%d",&a,&b,&t);G[a][b]=G[b][a]=t; // 創建鄰接矩陣}// Dijkstra算法求出源點q到其他各個頂點的最短路徑長度memset(visit,0,sizeof(visit));for(i=1;i<=m;i++)dist[i]=G[q][i]; // 初始化distvisit[q]=1;for(i=1;i<=m;i++){min=INF;for(j=1;j<=m;j++){if(!visit[j]&&min>dist[j]){min=dist[j];k=j;}}visit[k]=1;if(min==INF)break;for(j=1;j<=m;j++){if(!visit[j]&&dist[j]>min+G[k][j])dist[j]=min+G[k][j];}}// 找出軍隊所在頂點到源點的最小時間min=INF;for(i=0;i<n;i++){if(min>dist[army[i]])min=dist[army[i]];}printf("%d\n",min);}return 0; }

總結

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

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