0562:Shopping in JOI Kingdom
全てのショッピングモールのある街から
グラフの辺上も含めて最長距離を求める問題。
ショッピングモールのある街を全てスタート地点として
最初にキューにプッシュしてダイクストラする。
d[i]:=i番目の街からショッピングモールのある街への最短距離
とすると、
max(d[i]+d[j]+(i番目の街とj番目の街を結ぶ辺の距離)/2)
を四捨五入したものが答えとなる。
#include<iostream> #include<vector> #include<algorithm> #include<cmath> #include<queue> #define INF 100000001 using namespace std; struct edge{ int to; double cost; }; typedef pair<double,double>P; int N; double d[3001]; vector<edge>G[3001]; vector<int>S; void dijkstra(void){ priority_queue<P,vector<P>,greater<P> >que; fill(d,d+N+1,INF); for(int i=0;i<S.size();i++){ d[S[i]]=0; que.push(P(0,S[i])); } while(!que.empty()){ P p=que.top(); que.pop(); int v=p.second; if(d[v]<p.first)continue; for(int i=0;i<G[v].size();i++){ edge e=G[v][i]; if(d[e.to]>d[v]+e.cost){ d[e.to]=d[v]+e.cost; que.push(P(d[e.to],e.to)); } } } } int main(void){ int M,K,a,b,l,s; cin >> N >> M >> K; edge e; for(int i=0;i<M;i++){ cin >> a >> b >> e.cost; e.to=b; G[a].push_back(e); e.to=a; G[b].push_back(e); } for(int i=0;i<K;i++){ cin >> s; S.push_back(s); } dijkstra(); double ans=0; for(int i=1;i<=N;i++) for(int j=0;j<G[i].size();j++) ans=max(ans,round((d[i]+d[G[i][j].to]+G[i][j].cost)/2.0)); cout << ans << endl; return 0; }