標籤: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
i
≤ n,1 ≤ l
i
≤ 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(多源點最短路)