이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define DIM 100010
#define INF 2000000000
using namespace std;
struct muchie{
int x,y,cost;
};
vector <muchie> mch;
vector <pair<int,int> > L[DIM],edg[DIM];
priority_queue <pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > h;
int E[DIM*4],p[DIM*4],level[DIM],t[DIM],first[DIM],dist[DIM],v[DIM];
pair <int,int> rmq[21][DIM*4],dp[21][DIM];
int n,m,q,x,y,cost,i,j,k,cnt;
inline int cmp (muchie a, muchie b){
return a.cost > b.cost;
}
int get_rad (int x){
while (t[x] > 0)
x = t[x];
return x;
}
void dfs (int nod, int tata){
E[++k] = nod;
first[nod] = k;
level[nod] = 1 + level[tata];
for (auto it : edg[nod]){
int vecin = it.first, cost = it.second;
if (vecin != tata){
dp[0][vecin] = make_pair(cost,nod);
dfs (vecin,nod);
E[++k] = nod;
}}}
int get_lca (int x, int y){
int pozx = first[x], pozy = first[y];
if (pozx > pozy)
swap (pozx,pozy);
int nr = p[pozy-pozx+1];
pair <int,int> sol = min (rmq[nr][pozx],rmq[nr][pozy-(1<<nr)+1]);
return E[sol.second];
}
int get_min (int x, int lca){
int sol = INF;
for (int i=20;i>=0;i--){
int y = dp[i][x].second;
if (level[y] < level[lca])
continue;
sol = min (sol,dp[i][x].first);
x = y;
}
return sol;
}
int main (){
//ifstream cin ("date.in");
//ofstream cout ("date.out");
cin>>n>>m;
for (i=1;i<=m;i++){
cin>>x>>y>>cost;
L[x].push_back(make_pair(y,cost));
L[y].push_back(make_pair(x,cost));
}
for (i=1;i<=n;i++)
dist[i] = INF;
cin>>cnt;
for (i=1;i<=cnt;i++){
cin>>v[i];
h.push(make_pair(0,v[i]));
dist[v[i]] = 0;
}
while (!h.empty()){
int nod = h.top().second;
int cost = h.top().first;
h.pop();
if (dist[nod] != cost)
continue;
for (auto it : L[nod]){
int vecin = it.first, new_cost = it.second;
if (dist[nod] + new_cost < dist[vecin]){
dist[vecin] = dist[nod] + new_cost;
h.push(make_pair(dist[vecin],vecin));
}}}
/*cin>>q;
for (i=1;i<=q;i++)
cin>>qry[i].first>>qry[i].second;*/
for (i=1;i<=n;i++){
for (auto it : L[i]){
int vecin = it.first;
mch.push_back({i,vecin,min(dist[i],dist[vecin])});
}
}
sort (mch.begin(),mch.end(),cmp);
memset (t,-1,sizeof t);
for (auto it : mch){
int x = it.x, y = it.y;
int radx = get_rad(x), rady = get_rad(y);
if (radx != rady){
//cout<<x<<" "<<y<<" "<<it.cost<<"\n";
edg[x].push_back(make_pair(y,it.cost));
edg[y].push_back(make_pair(x,it.cost));
if (t[radx] > t[rady])
swap (radx,rady);
t[radx] += t[rady];
t[rady] = radx;
}
}
dfs (1,0);
for (i=1;i<=k;i++)
rmq[0][i] = make_pair(level[E[i]],i);
for (i=1;(1<<i)<=k;i++)
for (j=1;j<=k;j++){
rmq[i][j] = rmq[i-1][j];
if (j + (1<<(i-1)) <= k && rmq[i-1][j + (1<<(i-1))].first < rmq[i][j].first)
rmq[i][j] = rmq[i-1][j + (1<<(i-1))];
}
for (i=2;i<=k;i++)
p[i] = p[i/2] + 1;
for (i=1;(1<<i)<=n;i++)
for (j=1;j<=n;j++){
dp[i][j].second = dp[i-1][dp[i-1][j].second].second;
dp[i][j].first = min (dp[i-1][j].first,dp[i-1][dp[i-1][j].second].first);
}
cin>>q;
for (i=1;i<=q;i++){
cin>>x>>y;
int lca = get_lca (x,y);
cout<<min(get_min(x,lca),get_min(y,lca))<<"\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |