Submission #1268171

#TimeUsernameProblemLanguageResultExecution timeMemory
1268171MateiKing80Board Game (JOI24_boardgame)C++20
36 / 100
4091 ms7060 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
#define int ll

const int inf = 2e15;

using pii = pair<int, int>;
#define fr first
#define sc second

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int n, m, k;
	cin >> n >> m >> k;
	vector<vector<int>> vec(n);
	vector<bool> stop(n);
	for (int i = 0; i < m; i ++) {
		int u, v;
		cin >> u >> v;
		u --, v --;
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	int nrStop = 0;
	for (int i = 0; i < n; i ++) {
		char ch;
		cin >> ch;
		stop[i] = ch - '0';
		nrStop += stop[i];
	}
	vector<int> start(k);
	for (int i = 0; i < k; i ++) {
		cin >> start[i];
		start[i] --;
	}
	vector<int> distStart(n, inf), dp(n, 0);
	distStart[start[0]] = 0;
	queue<int> st;
	st.push(start[0]);
	vector<bool> viz(n, false);
	while (!st.empty()) {
		int x = st.front();
		st.pop();
		if ((x != start[0] && stop[x]) || viz[x])
			continue;
		viz[x] = true;
		for (auto i : vec[x]) {
			distStart[i] = min(distStart[i], 1 + distStart[x]);
			st.push(i);
		}
	}
	vector<int> ans(n, inf);
	for (int rep = 0; rep <= nrStop; rep ++) {
		int sum = 0;
		for (int i = 1; i < k; i ++) {
			sum += dp[start[i]];
		}
		for (int i = 0; i < n; i ++)
			ans[i] = min(ans[i], distStart[i] + sum);
		//recalc distStart
		auto distStart2 = distStart;
		priority_queue<pii> pq;
		for (int i = 0; i < n; i ++)
			pq.push({-distStart[i], i});
		viz.assign(n, 0);
		while (!pq.empty()) {
			auto x = pq.top();
			pq.pop();
			if (viz[x.sc])
				continue;
			viz[x.sc] = true;
			x.fr *= -1;
			distStart2[x.sc] = x.fr;
			for (auto i : vec[x.sc]) {
				int nw = 1;
				if (stop[x.sc])
					nw += distStart[x.sc];
				else
					nw += distStart2[x.sc];
				if (distStart2[i] > nw) {
					distStart2[i] = nw;
					pq.push({-nw, i});
				}
			}
		}
		distStart = distStart2;
		//recalc dp
		if (rep == 0)
			for (int i = 0; i < n; i ++)
				if (!stop[i])
					dp[i] = inf;
		vector<int> dp2(n, inf);
		for (int i = 0; i < n; i ++) {
			if (!stop[i])
				continue;
			for (auto j : vec[i])
				pq.push({-dp[i] - 1, j});
		}
		viz.assign(n, 0);
		while (!pq.empty()) {
			auto x = pq.top();
			pq.pop();
			if (viz[x.sc])
				continue;
			viz[x.sc] = true;
			x.fr *= -1;
			dp2[x.sc] = x.fr;
			if (!stop[x.sc]) {
				for (auto i : vec[x.sc]) {
					int nw = x.fr + 1;
					if (dp2[i] > nw) {
						dp2[i] = nw;
						pq.push({-nw, i});
					}
				}
			}
		}
		dp = dp2;
	}
	for (int i = 0; i < n; i ++)
		cout << ans[i] << '\n';
}

/*
imi trebuie un dp de tipul: pentru fiecare casuta stii numarul minim de operatii tipul 1 necesar
acum tu poti veni de la oricare alta casuta pe o ruta fara stop-uri
*/
#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...