| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1347021 | LmaoLmao | Evacuation plan (IZhO18_plan) | C++20 | 446 ms | 58896 KiB |
#include <bits/stdc++.h>
#define int long long
#define name "EXIT"
#define fi first
#define se second
using namespace std;
using ll = long long;
using ii = pair<int,int>;
using aa = array<int,4>;
const int N = 1e5+5;
const int MOD = 1e9 + 7;
int d[N];
int p[N];
vector<int> qr[N],nen;
vector<ii> adj[N];
int ans[N];
int L[N],R[N];
ii a[N];
int get(int u) {
if(p[u]<0) return u;
return p[u]=get(p[u]);
}
void unite(int u,int v) {
u=get(u);
v=get(v);
if(u==v) return;
if(p[u]>p[v]) swap(u,v);
p[u]+=p[v];
p[v]=u;
return;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
if (fopen(name".inp","r")) {
freopen(name".inp","r",stdin);
freopen(name".out","w",stdout);
}
int n,m;
cin >> n >> m;
for(int i=1;i<=m;i++) {
int u,v,w;
cin >> u >> v >> w;
adj[u].push_back({v,w});
adj[v].push_back({u,w});
}
for(int i=1;i<=n;i++) {
d[i]=1e18;
}
priority_queue<ii,vector<ii>,greater<ii>> pq;
int k;
cin >> k;
for(int i=1;i<=k;i++) {
int x;
cin >> x;
pq.push({0,x});
d[x]=0;
}
while(!pq.empty()) {
ii u=pq.top();
pq.pop();
if(u.fi>d[u.se]) continue;
for(ii v:adj[u.se]) {
if(d[v.fi]>u.fi+v.se) {
pq.push({d[v.fi]=u.fi+v.se,v.fi});
}
}
}
for(int i=1;i<=n;i++) {
nen.push_back(d[i]);
}
sort(nen.begin(),nen.end());
for(int i=1;i<=n;i++) {
d[i]=lower_bound(nen.begin(),nen.end(),d[i])-nen.begin()+1;
}
int q;
cin >> q;
for(int i=1;i<=q;i++) {
cin >> a[i].fi >> a[i].se;
L[i]=1;
R[i]=n;
}
while(1) {
bool c=0;
for(int i=1;i<=n;i++) {
qr[i].clear();
}
for(int i=1;i<=n;i++) {
p[i]=0;
qr[d[i]].push_back(-i);
}
for(int i=1;i<=q;i++) {
if(L[i]<=R[i]) {
c=1;
qr[L[i]+R[i] >> 1].push_back(i);
}
}
if(!c) break;
for(int i=n;i>0;i--) {
for(int x:qr[i]) {
if(x<0) {
p[-x]=-1;
for(ii v:adj[-x]) {
if(p[v.fi]!=0) {
unite(-x,v.fi);
}
}
}
else {
if(p[a[x].fi]!=0 && p[a[x].se]!=0 && get(a[x].fi)==get(a[x].se)) {
L[x]=i+1;
ans[x]=i;
}
else {
R[x]=i-1;
}
}
}
}
//break;
}
for(int i=1;i<=q;i++) {
cout << nen[ans[i]-1] << endl;
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
| # | 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... | ||||
