이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <iostream>
// #define int long long
#define ld long double
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define pb push_back
#define mp(a,b) make_pair(a,b)
#define ms(v,x) memset(v,x,sizeof(v))
#define all(v) v.begin(),v.end()
#define ff first
#define ss second
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define per(i, a, b) for(int i = b-1; i>=a ; i--)
#define trav(a, x) for(auto& a : x)
#define allin(a , x) for(auto a : x)
#define Unique(v) sort(all(v)),v.erase(unique(all(v)),v.end());
#define sz(v) ((int)v.size())
using namespace std;
typedef vector<int> vi;
#define y1 abacaba
//#define left oooooopss
#define db(x) cerr << #x <<" == "<<x << endl;
#define db2(x,y) cerr<<#x <<" == "<<x<<", "<<#y<<" == "<<y<<endl;
#define db3(x,y,z) cerr << #x<<" == "<<x<<", "<<#y<<" == "<<y<<", "<<#z<<" == "<<z<<endl;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<ll> vl;
// std::mt19937_64 rng64((int) std::chrono::steady_clock::now().time_since_epoch().count());
std::mt19937 rng(
// (int) std::chrono::steady_clock::now().time_since_epoch().count()
1239010
);
ll cdiv(ll a, ll b) { return a/b+((a^b)>0&&a%b); } // divide a by b rounded up
ll fdiv(ll a, ll b) { return a/b-((a^b)<0&&a%b); } // divide a by b rounded down
//inline ll mod(ll n, ll m ){ ll ret = n%m; if(ret < 0) ret += m; return ret; }
ll gcd(ll a, ll b){return (b == 0LL ? a : gcd(b, a%b));}
ll exp(ll b,ll e,ll m){
b%=m;
ll ans = 1;
for (; e; b = b * b % m, e /= 2)
if (e & 1) ans = ans * b % m;
return ans;
}
// debug:
template<class T>void print_vector(vector<T> &v){
rep(i,0,sz(v))cout<<v[i]<<" \n"[i==sz(v)-1];
}
void dbg_out() {cerr << endl; }
template<typename Head, typename ... Tail> void dbg_out(Head H,Tail... T){
cerr << ' ' << H;
dbg_out(T...);
}
#ifdef LOCAL
#define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__), cerr << endl
#else
#define dbg(...) 42
#endif
//
const int N = 100100;
int n,m;
int d[N];
vector<pii> g[N];
int p[N], ps[N], ar[N];
int f(int x){
while(p[x]!=x)x=p[x];
return x;
}
int H(int x){
int r=0;
while(p[x]!=x)x = p[x], r++;
return r;
}
void join(int a,int b,int val){
a = f(a),b=f(b);
if(a==b)return;
if(ps[a] > ps[b])swap(a,b);
ps[b] += ps[a];
p[a] = b;
ar[a] = val;
}
int qry(int a,int b){
int ha = H(a), hb = H(b);
int res = 1e9;
while(a!=b){
if(ha > hb){
res = min(res, ar[a]);
a = p[a];
ha--;
}else{
res = min(res, ar[b]), b = p[b], hb--;
}
}
return res;
}
int32_t main(){
fastio;
cin >> n >> m;
rep(i,0,m){
int a,b,c;
cin >> a >> b >> c;
g[a].pb(pii(b,c));
g[b].pb(pii(a,c));
}
rep(i,1,n+1)d[i] = 1e9;
int k;
cin >> k;
priority_queue<pii, vector<pii>, greater<pii> > pq;
rep(i,0,k){
int v;
cin >> v;
if(d[v]!=0){
d[v] = 0;
pq.push(pii(d[v] , v));
}
}
while(!pq.empty()){
auto [dd, v] = pq.top();
pq.pop();
if(dd != d[v])continue;
for(auto [to,w] : g[v]){
if(d[to] > d[v] + w){
pq.push(pii(d[to] = d[v] + w , to));
}
}
}
rep(i,1,n+1){
p[i] = i,ps[i] = 1;
}
vector<array<int,3>> ed;
rep(i,1,n+1)for(auto [to,w] : g[i]){
ed.pb({min(d[i], d[to]), i , to});
}
sort(all(ed));
reverse(all(ed));
for(auto [val,a,b] : ed){
join(a,b,val);
}
int q;
cin >> q;
while(q--){
int s,t;
cin >> s >> t;
cout << qry( s , t )<< endl;
}
// math -> gcd it all
// Did you swap N,M? N=1?
}
# | 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... |