城市平亂
時間限制: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裸的迪傑斯特拉,直接求從q到個駐軍城市的最短路即可
**
#include
#include
#include
#include
using
namespace
std;
const
int maxn=1005;
const
int inf=99999999;
intmap[maxn][maxn];//鄰接矩陣存圖
int dis[maxn];//記錄單源最短路距離
int vis[maxn];//已訪問標記為1,初始化為0
int num[maxn];//第i個部隊駐紮在num[i]城市
int n;//部隊數量
int m;//城市數量
int p;//城市之間道路數量
int q;//需要到達的城市編號
void dijstar(int point)//dis記錄從point到各點最短路
}}int main()
int min_time=inf;//最短時間
dijstar(q);
for(int i=1; i<=n; i++)//尋找最短時間
min_time=min(min_time,dis[num[i]]);
printf("%d\n",min_time);
}return
0;}
附上最優解,優先佇列剪枝優化過的單源最短路
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int max=1010;
int len[max];
bool visited[max];
int n,m,p,q,a,b,d;
priority_queueint,int>,vector
int,int> >,greaterint,int> > > dq;
struct node
int num,dis;
};void dijkstra(vector
>& g) //優先佇列實現dijkstra
for(int i=0;i!=p;++i)
dijkstra(g);
cout
<1]memset(visited,0,sizeof(visited));
}}
nyoj 115 城市平亂
時間限制 1000 ms 記憶體限制 65535 kb難度 4 描述 南將軍統領著n個部隊,這n個部隊分別駐紮在n個不同的城市。他在用這n個部隊維護著m個城市的治安,這m個城市分別編號從1到m。現在,小工軍師告訴南將軍,第k號城市發生了 南將軍從各個部隊都派遣了乙個分隊沿最近路去往 城市平亂。現在已...
nyoj 115 城市平亂
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 南將軍統領著n個部隊,這n個部隊分別駐紮在n個不同的城市。他在用這n個部隊維護著m個城市的治安,這m個城市分別編號從1到m。現在,小工軍師告訴南將軍,第k號城市發生了 南將軍從各個部隊都派遣了乙個分隊沿最近路去往 城市平亂。現在...
NYOJ 115 城市平亂
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 南將軍統領著n個部隊,這n個部隊分別駐紮在n個不同的城市。他在用這n個部隊維護著m個城市的治安,這m個城市分別編號從1到m。現在,小工軍師告訴南將軍,第k號城市發生了 南將軍從各個部隊都派遣了乙個分隊沿最近路去往 城市平亂。現在...