제출 #1317496

#제출 시각아이디문제언어결과실행 시간메모리
1317496benedict0724Board Game (JOI24_boardgame)C++20
0 / 100
31 ms6888 KiB
#include <iostream> #include <algorithm> #include <stack> #include <queue> #include <vector> #include <map> #include <iomanip> using namespace std; typedef long long ll; const ll INF = 1e14; vector<int> adj[50002]; int x[50002]; int n, m, k; vector<ll> shortest_path(int s, vector<int> dont) { queue<int> q; vector<ll> d(n); q.push(s); for(int i=0;i<n;i++) d[i] = INF; d[s] = 0; while(!q.empty()) { int now = q.front(); q.pop(); if(dont[now] && now != s) continue; for(int nxt : adj[now]) { if(d[nxt] > d[now] + 1) { d[nxt] = d[now] + 1; q.push(nxt); } } } return d; } vector<ll> next_stop(string s) { queue<int> q; vector<ll> d(n); for(int i=0;i<n;i++) { if(s[i] == '0') d[i] = INF; else q.push(i); } while(!q.empty()) { int now = q.front(); q.pop(); for(int nxt : adj[now]) { if(d[nxt] > d[now] + 1) { d[nxt] = d[now] + 1; q.push(nxt); } } } for(int i=0;i<n;i++) if(d[i] == 0) { d[i] = 2; for(int j : adj[i]) if(s[j] == '1') d[i] = 1; } return d; } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m >> k; for(int i=0;i<m;i++) { int u, v; cin >> u >> v; --u; --v; adj[u].push_back(v); adj[v].push_back(u); } string s; cin >> s; int st1 = -1, st2 = -1; for(int i=0;i<n;i++) { if(s[i] == '1') { if(st1 != -1) st2 = i; else st1 = i; } } for(int i=0;i<k;i++) { cin >> x[i]; --x[i]; } vector<int> dont(n, 0); vector<ll> v1 = shortest_path(st1, dont); vector<ll> v2 = shortest_path(st2, dont); dont[st1] = 1; dont[st2] = 0; vector<ll> v3 = shortest_path(st2, dont); dont[st1] = 0; dont[st2] = 1; vector<ll> v4 = shortest_path(st1, dont); dont[st1] = dont[st2] = 1; vector<ll> v5 = shortest_path(x[0], dont); vector<ll> ns = next_stop(s); ll Cost = 0; for(int i=1;i<k;i++) { Cost += ns[x[i]]; } ll Cost2 = Cost + ns[st1] * (k-1); vector<ll> ans(n); for(int i=0;i<n;i++) { ans[i] = min(v5[i], Cost2 + v1[x[0]] + v1[st2] + v2[i]); ans[i] = min(ans[i], Cost + v3[x[0]] + v3[i]); ans[i] = min(ans[i], Cost + v4[x[0]] + v4[i]); } for(int i=0;i<n;i++) cout << ans[i] << "\n"; }
#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...