NYOJ 115 城市平乱(图论Dijkstra)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 115 城市平乱(图论Dijkstra)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
城市平亂
時間限制:1000 ms ?|? 內存限制:65535 KB 難度:4 描述南將軍統領著N個部隊,這N個部隊分別駐扎在N個不同的城市。
他在用這N個部隊維護著M個城市的治安,這M個城市分別編號從1到M。
現在,小工軍師告訴南將軍,第K號城市發生了暴亂,南將軍從各個部隊都派遣了一個分隊沿最近路去往暴亂城市平亂。
現在已知在任意兩個城市之間的路行軍所需的時間,你作為南將軍麾下最厲害的程序員,請你編寫一個程序來告訴南將軍第一個分隊到達叛亂城市所需的時間。
注意,兩個城市之間可能不只一條路。
輸入每組測試數據的第一行是四個整數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
數據保證暴亂的城市是可達的。
分析:由于最終每個城市的軍隊都要到達暴亂城市,所以我們可以選擇暴亂城市作為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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝二面微服务、分布式架构?太真实了!
- 下一篇: JimuReport 1.3.7 首个正