Metropolis(多源點最短路)
阿新 • • 發佈:2018-10-09
sin tex test code sim oid 樹形結構 end lis
在若幹年之後,其中p座城市發展成了大都會,道路的數量也增加到了m條。
大都會之間經常有貿易往來,因此,對於每座大都會,請你求出它到離它最近的其它大都會的距離。
i
Metropolis
https://www.nowcoder.com/acm/contest/203/I
題目描述
魔方國有n座城市,編號為。城市之間通過n-1條無向道路連接,形成一個樹形結構。在若幹年之後,其中p座城市發展成了大都會,道路的數量也增加到了m條。
大都會之間經常有貿易往來,因此,對於每座大都會,請你求出它到離它最近的其它大都會的距離。
輸入描述:
第一行三個整數n,m,p (1 ≤ n,m ≤ 2*105
,2 ≤ p ≤ n),第二行p個整數
表示大都會的編號 (1≤ xi
≤ n)。接下來m行每行三個整數ai
,bi
,li
表示一條連接ai
和bi
,長度為li
的道路 (1 ≤ a
,bi
≤ n,1 ≤ li
≤ 109
)。
保證圖是連通的。
輸出描述:
輸出一行p個整數,第i個整數表示xi
的答案。示例1
輸入
5 6 3 2 4 5 1 2 4 1 3 1 1 4 1 1 5 4 2 3 1 3 4 3
輸出
3 3 5
1 #include<iostream> 2 #include<cmath> 3 #include<vector> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7View Code#define maxn 200005 8 #define mem(a,b) memset(a,b,sizeof(a)) 9 typedef long long ll; 10 const ll INF=0x3f3f3f3f3f3f3f3f; 11 using namespace std; 12 13 vector<pair<int,ll> >ve[maxn]; 14 int n,p; 15 int a[maxn],bel[maxn];///離哪個大都會最近 16 ll dis[maxn]; 17 int vis[maxn]; 18 ll ans[maxn];///求離自己最近的大都會的距離19 struct sair{ 20 int pos; 21 ll len; 22 friend bool operator<(sair a,sair b){ 23 return a.len>b.len; 24 } 25 }; 26 void Dijstra(){ 27 for(int i=0;i<=n;i++){ 28 dis[i]=INF; 29 ans[i]=INF; 30 vis[i]=0; 31 } 32 sair s,e; 33 int pos; 34 ll len; 35 priority_queue<sair>Q; 36 for(int i=1;i<=p;i++){ 37 s.len=0,s.pos=a[i]; 38 Q.push(s); 39 dis[a[i]]=0; 40 bel[a[i]]=a[i]; 41 } 42 while(!Q.empty()){ 43 s=Q.top(); 44 Q.pop(); 45 if(!vis[s.pos]){ 46 vis[s.pos]=1; 47 for(int i=0;i<ve[s.pos].size();i++){ 48 pos=ve[s.pos][i].first; 49 len=ve[s.pos][i].second; 50 if(dis[pos]>dis[s.pos]+len){ 51 dis[pos]=dis[s.pos]+len; 52 bel[pos]=bel[s.pos]; 53 e.len=dis[pos]; 54 e.pos=pos; 55 Q.push(e); 56 } 57 else if(bel[pos]!=bel[s.pos]){ 58 ///當兩個城市屬於不同的大都會時,A地到B地的最近距離為A地到K地再到B地的距離 59 ans[bel[pos]]=min(ans[bel[pos]],dis[pos]+dis[s.pos]+len); 60 ans[bel[s.pos]]=min(ans[bel[s.pos]],dis[pos]+dis[s.pos]+len); 61 } 62 } 63 } 64 } 65 66 67 } 68 69 int main(){ 70 std::ios::sync_with_stdio(false); 71 int m; 72 cin>>n>>m>>p; 73 for(int i=1;i<=p;i++){ 74 cin>>a[i]; 75 } 76 int aa,bb,vv; 77 while(m--){ 78 cin>>aa>>bb>>vv; 79 ve[aa].push_back(make_pair(bb,vv)); 80 ve[bb].push_back(make_pair(aa,vv)); 81 } 82 Dijstra(); 83 for(int i=1;i<=p;i++){ 84 if(i!=1){ 85 cout<<" "; 86 } 87 cout<<ans[a[i]]; 88 } 89 cout<<endl; 90 }
Metropolis(多源點最短路)