제출 #1131440

#제출 시각아이디문제언어결과실행 시간메모리
1131440huutuanBoard Game (JOI24_boardgame)C++20
14 / 100
39 ms7160 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int N=5e4+10; int n, m, k, a[N], x[N]; vector<int> g[N]; int d1[N], d2[N]; void bfs2(vector<int> root, int *d, int dd){ for (int i=0; i<=n; ++i) d[i]=1e9; queue<int> q; for (int u:root) d[u]=0, q.push(u); while (q.size()){ int u=q.front(); q.pop(); for (int v:g[u]){ if (d[u] && a[u]) continue; if (d[v]>=1e9){ d[v]=d[u]+1; q.emplace(v); } } } for (int u:root) d[u]=dd; } int vis[N]; void bfs3(int root, vector<int> &vv){ queue<int> q; vis[root]=1; q.push(root); while (q.size()){ int u=q.front(); q.pop(); vv.push_back(u); for (int v:g[u]){ if (!vis[v] && a[v]){ vis[v]=1; q.emplace(v); } } } } int f[N][2]; void dijkstra(int root, int sum1, int sum2){ for (int i=0; i<=n; ++i) f[i][0]=f[i][1]=1e18; priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq; pq.push({f[root][0]=0, {root, 0}}); while (pq.size()){ int u=pq.top().second.first, cnt=pq.top().second.second, dist=pq.top().first; pq.pop(); if (f[u][cnt]!=dist) continue; if (u!=root && a[u]){ if (!cnt) dist+=sum1; else dist+=sum2; cnt=1; } for (int v:g[u]){ if (f[v][cnt]>dist+1){ pq.push({f[v][cnt]=dist+1, {v, cnt}}); } } } } int ans[N]; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> k; for (int i=1; i<=m; ++i){ int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } string s; cin >> s; for (int i=1; i<=n; ++i) a[i]=s[i-1]=='1'; for (int i=1; i<=k; ++i) cin >> x[i]; vector<int> v1, v2; for (int i=1; i<=n; ++i) if (a[i] && !vis[i]){ vector<int> v; bfs3(i, v); if ((int)v.size()==1) v1.insert(v1.end(), v.begin(), v.end()); else v2.insert(v2.end(), v.begin(), v.end()); } bfs2(v1, d1, 2); bfs2(v2, d2, 1); memset(ans, 0x3f, sizeof ans); vector<pair<int, int>> v; for (int j=2; j<=k; ++j){ v.emplace_back(d1[x[j]], d2[x[j]]); } sort(v.begin(), v.end(), [&](pair<int, int> t1, pair<int, int> t2){ return t1.first-t1.second<t2.first-t2.second; }); for (int i=0; i<=k-1; ++i){ if (v2.empty() && i!=k-1) continue; if (v1.empty() && i) continue; int sum1=0, sum2=i*2+(k-1-i); for (int j=0; j<i; ++j) sum1+=v[j].first; for (int j=i; j<k-1; ++j) sum1+=v[j].second; dijkstra(x[1], sum1, sum2); for (int j=1; j<=n; ++j) ans[j]=min({ans[j], f[j][0], f[j][1]}); } for (int i=1; i<=n; ++i) cout << ans[i] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...