Metropolis(多源點最短路)

來源:互聯網
上載者:User

標籤:vector   lan   open   include   不同   img   http   mem   描述   

Metropolis

https://www.nowcoder.com/acm/contest/203/I

題目描述魔方國有n座城市,編號為。城市之間通過n-1條無向道路串連,形成一個樹形結構。
在若干年之後,其中p座城市發展成了大都會,道路的數量也增加到了m條。
大都會之間經常有貿易往來,因此,對於每座大都會,請你求出它到離它最近的其它大都會的距離。輸入描述:
第一行三個整數n,m,p (1 ≤ n,m ≤ 2*10
5
,2 ≤ p ≤ n),第二行p個整數
表示大都會的編號 (1≤ x
i
≤ n)。接下來m行每行三個整數a
i
,b
i
,l
i
表示一條串連a
i
和b
i
,長度為l
i
的道路 (1 ≤ a
i
,b
≤ n,1 ≤ l
≤ 10
9
)。
保證圖是連通的。
輸出描述:
輸出一行p個整數,第i個整數表示x
i
的答案。
樣本1輸入
5 6 32 4 51 2 41 3 11 4 11 5 42 3 13 4 3
輸出
3 3 5

 1 #include<iostream> 2 #include<cmath> 3 #include<vector> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 #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 }
View Code

 

Metropolis(多源點最短路)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.