이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
vector<int> par, sz;
int find(int x) {return par[x]==x ? x : par[x]=find(par[x]);}
void join(int x, int y) {
x=find(x); y=find(y);
if(sz[x]<sz[y]) swap(x, y);
sz[x]+=sz[y];
par[y]=x;
}
double solve(int n, int m, int k, int h, vector<int> x, vector<int> y, vector<int> c, vector<int> a) {
k=min(k, 100); double INF=1e18;
par.resize(n); sz.resize(n);
for(int i=0; i<n; i++) par[i]=i, sz[i]=1;
vector<vector<pair<int, double>>> adj(n);
for(int i=0; i<m; i++) {
adj[x[i]].push_back({y[i], c[i]});
adj[y[i]].push_back({x[i], c[i]});
if(x[i]!=h && y[i]!=h) join(x[i], y[i]);
}
priority_queue<tuple<double, int, int>> pq;
vector<vector<double>> dist(n, vector<double>(k+1)); for(auto &p : dist) for(double &pp : p) pp=INF;
dist[h][0]=0; pq.push({0, 0, h});
double ans=1e18;
while(!pq.empty()) {
double cur=get<0>(pq.top());
int div=get<1>(pq.top()), u=get<2>(pq.top());
pq.pop(); cur=-cur;
if(dist[u][div]!=cur) continue;
if(a[u]==2 && div<k) div++;
if(u==0 || (a[u]==0 && par[u]==par[0])) {ans=min(ans, cur); continue;}
if(a[u]==0) continue;
for(auto p : adj[u]) {
double edge=p.second;
for(int i=0; i<div; i++) edge=edge/2.;
if(dist[p.first][div]>cur+edge) {
dist[p.first][div]=cur+edge;
pq.push({-dist[p.first][div], div, p.first});
}
}
}
return ans;
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |