제출 #935134

#제출 시각아이디문제언어결과실행 시간메모리
935134MinaRagy06자매 도시 (APIO20_swap)C++17
0 / 100
2060 ms26040 KiB
#include <bits/stdc++.h>
#ifdef MINA
#include "grader.cpp"
#endif
using namespace std;
#define ll long long

const int N = 200'005;
int n, m;
array<int, 3> e[N];
vector<int> adj[N];
void init(int _n, int _m, vector<int> u, vector<int> v, vector<int> w) {
	n = _n, m = _m;
	for (int i = 0; i < m; i++) {
		e[i] = {u[i], v[i], w[i]};
	}
	sort(e, e + m, [&] (array<int, 3> x, array<int, 3> y) {return x[2] < y[2];});
}
int dist[N], ok[N], t[N], low[N], cur, vis[N], bad;
int dfs(int i, int p, int x, int y) {
	vis[i] = 1;
	t[i] = low[i] = cur++;
	int cnt = 0;
	for (auto nxt : adj[i]) {
		if (nxt == p) continue;
		if (vis[nxt]) {
			low[i] = min(low[i], t[nxt]);
		} else {
			int val = dfs(nxt, i, x, y);
			low[i] = min(low[i], low[nxt]);
			if (low[nxt] > t[i] && val == 1) {
				bad = 1;
			}
			cnt += val;
		}
	}
	cnt += i == x || i == y;
	return cnt;
}
int getMinimumFuelCapacity(int x, int y) {
	int l = 0, r = m - 1;
	while (l <= r) {
		int md = ((l + r) >> 1);
		for (int i = 0; i < n; i++) {
			adj[i].clear();
			dist[i] = 1e9;
			ok[i] = 0;
			vis[i] = 0;
		}
		bad = 0;
		for (int i = 0; i <= md; i++) {
			adj[e[i][0]].push_back(e[i][1]);
			adj[e[i][1]].push_back(e[i][0]);
		}
		queue<array<int, 2>> q;
		q.push({x, 0});
		dist[x] = 0;
		while (q.size()) {
			int i = q.front()[0];
			int c = q.front()[1];
			q.pop();
			if (i != x) ok[i] |= adj[i].size() > 2;
			for (auto nxt : adj[i]) {
				if (c + 1 < dist[nxt]) {
					dist[nxt] = c + 1;
					ok[nxt] = ok[i];
					q.push({nxt, c + 1});
				}
			}
		}
		dfs(x, -1, x, y);
// 		if (e[md][2] == 1) {
// 			cout << low[2] << ' ' << t[1] << '\n';
// 		}
		if (ok[y] || (vis[y] && !bad)) {
			r = md - 1;
		} else {
			l = md + 1;
		}
	}
	if (l == m) {
		return -1;
	}
	return e[l][2];
}
#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...