Submission #1001773

#TimeUsernameProblemLanguageResultExecution timeMemory
1001773Nomio경주 (Race) (IOI11_race)C++17
0 / 100
4 ms11100 KiB
#include<bits/stdc++.h>
#define s second
#define f first
using namespace std;
using ll = long long;
vector<int> adj[200000];
vector<pair<int, int>> adj1[200000];
ll dis[1000][1000] {};
int cost[1000][1000] {}, D[1000][1000] {};
int dp[200000][101], K;
int S = 1e9;
void dfs(int X, int Y) {
	for(int i = 0; i <= K; i++) {
		dp[X][i] = 1e9;
	}	
	dp[X][0] = 0;
	for(pair<int, int> P : adj1[X]) {
		int x = P.f;
		int y = P.s;
		if(x != Y) {
			dfs(x, X);
			for(int i = 0; i + y <= K; i++) {
				int j = K - i - x;
				S = min(S, dp[X][i] + dp[x][j] + 1);
			}
			for(int i = 0; i + y <= K; i++) {
				dp[X][i + y] = min(dp[X][i + y], dp[x][i] + 1);
			}
		}
	}
}
int best_path(int n, int k, int H[][2], int L[]) {
	for(int i = 0; i < n; i++) {
		adj[i].clear();
		adj1[i].clear();
	}
	for(int i = 0; i < min(n, 1000); i++) {
		for(int j = 0; j < min(n, 1000); j++) {
			dis[i][j] = 0;
			cost[i][j] = 0;
			D[i][j] = 0;
		}
	}
	for(int i = 0; i < min(999, n - 1); i++) {
		adj[H[i][0]].push_back(H[i][1]);
		adj[H[i][1]].push_back(H[i][0]);
		adj1[H[i][0]].push_back({H[i][1], L[i]});
		adj1[H[i][1]].push_back({H[i][0], L[i]});
		cost[H[i][0]][H[i][1]] = L[i];
		cost[H[i][1]][H[i][0]] = L[i];
	}
	if(k <= 100) {
		S = 1e9;
		K = k;
		dfs(0, -1);
		if(S == 1e9) {
			S = -1;
		}
		return S;
	} else {
		for(int i = 0; i < n; i++) {
			bool vis[n] {};	
			queue<int> q;
			q.push(i);
			vis[i] = 1;
			while(!q.empty()) {
				int x = q.front();
				q.pop();
				for(int X : adj[x]) {
					if(!vis[X]) {
						dis[i][X] = dis[i][x] + cost[x][X];
						D[i][X] = D[i][x] + 1;
						vis[X] = 1;
						q.push(X);
					}
				}
			}
		}
		int mn = 1e9;
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				if(i == j) continue;
				if(dis[i][j] == k) {
					mn = min(mn, D[i][j]);
				}
			}
		}
		if(mn == 1e9) mn = -1;
		return mn;
	}
}
//int main() {
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	int n, k;
//	cin >> n >> k;
//	int H[n][2], L[n];
//	for(int i = 0; i < n - 1; i++) {
//		cin >> H[i][0] >> H[i][1];
//	}
//	for(int i = 0; i < n - 1; i++) {
//		cin >> L[i];
//	}
//	
//	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...