답안 #635328

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
635328 2022-08-26T05:34:02 Z S2speed LOSTIKS (INOI20_lostiks) C++17
59 / 100
2000 ms 250820 KB
#include<bits/stdc++.h>

using namespace std;

#pragma GCC optimize ("Ofast")

#define sze(x) (int)(x.size())
typedef long long ll;
typedef pair<ll , ll> pll;
typedef pair<int , int> pii;

const ll maxn = (1 << 20) + 17 , inf = 2e8;

int n , s , t;
vector<pii> adj[maxn];
int dis[22][maxn];
int bfs[maxn] , sz = 0;
int g[maxn] , k[22] , d[22] , e[22] , dp[maxn][22];

void BFS(int r , int h , bool f = false){
	sz = 0;
	dis[h][r] = 0;
	g[r] = 0;
	bfs[sz++] = r;
	int x = 0;
	while(x < sz){
		int v = bfs[x++];
		for(auto p : adj[v]){
			int i = p.first , t = p.second;
			if(dis[h][i] < dis[h][v] + 1) continue;
			if(f){
				g[i] = g[v];
				if(t != -1){
					g[i] ^= (1 << t);
					d[t] = v;
				}
			}
			dis[h][i] = dis[h][v] + 1;
			bfs[sz++] = i;
		}
	}
	return;
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	memset(dp , 63 , sizeof(dp));
	memset(dis , 63 , sizeof(dis));
	cin>>n>>s>>t; s--; t--;
	int m = 0;
	for(int i = 1 ; i < n ; i++){
		int v , u , w;
		cin>>v>>u>>w; v--; u--; w--;
		if(w != -1){
			k[m] = w;
			adj[v].push_back({u , m}); adj[u].push_back({v , m});
			m++;
		} else {
			adj[v].push_back({u , w}); adj[u].push_back({v , w});
		}
	}
	BFS(s , m , true);
	if(g[t] == 0){
		cout<<dis[m][t]<<'\n';
		return 0;
	}
	for(int j = 0 ; j < m ; j++){
		e[j] = g[k[j]] | g[d[j]];
		BFS(d[j] , j);
		if(e[j] == 0){
			dp[(1 << j)][j] = dis[m][k[j]] + dis[j][k[j]];
		}
	}
	int lm = (1 << m);
	for(int mask = 1 ; mask < lm ; mask++){
		for(int j = 0 ; j < m ; j++){
			if(mask & (1 << j)) continue;
			if((e[j] & mask) != e[j]) continue;
			int h = inf;
			for(int i = 0 ; i < m ; i++){
				if(!(mask & (1 << i))) continue;
				h = min(h , dp[mask][i] + dis[i][k[j]] + dis[j][k[j]]);
			}
			dp[mask ^ (1 << j)][j] = min(dp[mask ^ (1 << j)][j] , h);
		}
	}
	int ans = inf;
	for(int mask = 1 ; mask < lm ; mask++){
		if((g[t] & mask) != g[t]) continue;
		int h = inf;
		for(int i = 0 ; i < m ; i++){
			if(!(mask & (1 << i))) continue;
//			cout<<mask<<' '<<i<<'\n';
			h = min(h , dp[mask][i] + dis[i][t]);
		}
		ans = min(ans , h);
	}
	cout<<(ans == inf ? -1 : ans)<<'\n';
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 205436 KB Output is correct
2 Correct 77 ms 205520 KB Output is correct
3 Correct 151 ms 210112 KB Output is correct
4 Correct 150 ms 210080 KB Output is correct
5 Correct 132 ms 210048 KB Output is correct
6 Correct 142 ms 210052 KB Output is correct
7 Correct 139 ms 210004 KB Output is correct
8 Correct 151 ms 210120 KB Output is correct
9 Correct 160 ms 210052 KB Output is correct
10 Correct 143 ms 210052 KB Output is correct
11 Correct 162 ms 210132 KB Output is correct
12 Correct 148 ms 209416 KB Output is correct
13 Correct 129 ms 209520 KB Output is correct
14 Correct 134 ms 209392 KB Output is correct
15 Correct 136 ms 209456 KB Output is correct
16 Correct 133 ms 209516 KB Output is correct
17 Correct 142 ms 209424 KB Output is correct
18 Correct 136 ms 209500 KB Output is correct
19 Correct 125 ms 209620 KB Output is correct
20 Correct 127 ms 209448 KB Output is correct
21 Correct 140 ms 209488 KB Output is correct
22 Correct 85 ms 205496 KB Output is correct
23 Correct 80 ms 205536 KB Output is correct
24 Correct 77 ms 205500 KB Output is correct
25 Correct 79 ms 205452 KB Output is correct
26 Correct 78 ms 205476 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 205460 KB Output is correct
2 Correct 79 ms 205460 KB Output is correct
3 Correct 84 ms 205412 KB Output is correct
4 Correct 80 ms 205432 KB Output is correct
5 Correct 197 ms 205836 KB Output is correct
6 Correct 197 ms 205840 KB Output is correct
7 Correct 229 ms 205836 KB Output is correct
8 Correct 175 ms 205908 KB Output is correct
9 Correct 200 ms 205836 KB Output is correct
10 Correct 141 ms 205780 KB Output is correct
11 Correct 140 ms 205796 KB Output is correct
12 Correct 138 ms 205840 KB Output is correct
13 Correct 154 ms 205820 KB Output is correct
14 Correct 138 ms 205800 KB Output is correct
15 Correct 180 ms 205740 KB Output is correct
16 Correct 207 ms 205796 KB Output is correct
17 Correct 193 ms 205776 KB Output is correct
18 Correct 137 ms 205752 KB Output is correct
19 Correct 136 ms 205788 KB Output is correct
20 Correct 140 ms 205800 KB Output is correct
21 Correct 161 ms 205716 KB Output is correct
22 Correct 141 ms 205724 KB Output is correct
23 Correct 138 ms 205768 KB Output is correct
24 Correct 138 ms 205748 KB Output is correct
25 Correct 621 ms 205516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 205436 KB Output is correct
2 Correct 77 ms 205520 KB Output is correct
3 Correct 151 ms 210112 KB Output is correct
4 Correct 150 ms 210080 KB Output is correct
5 Correct 132 ms 210048 KB Output is correct
6 Correct 142 ms 210052 KB Output is correct
7 Correct 139 ms 210004 KB Output is correct
8 Correct 151 ms 210120 KB Output is correct
9 Correct 160 ms 210052 KB Output is correct
10 Correct 143 ms 210052 KB Output is correct
11 Correct 162 ms 210132 KB Output is correct
12 Correct 148 ms 209416 KB Output is correct
13 Correct 129 ms 209520 KB Output is correct
14 Correct 134 ms 209392 KB Output is correct
15 Correct 136 ms 209456 KB Output is correct
16 Correct 133 ms 209516 KB Output is correct
17 Correct 142 ms 209424 KB Output is correct
18 Correct 136 ms 209500 KB Output is correct
19 Correct 125 ms 209620 KB Output is correct
20 Correct 127 ms 209448 KB Output is correct
21 Correct 140 ms 209488 KB Output is correct
22 Correct 85 ms 205496 KB Output is correct
23 Correct 80 ms 205536 KB Output is correct
24 Correct 77 ms 205500 KB Output is correct
25 Correct 79 ms 205452 KB Output is correct
26 Correct 78 ms 205476 KB Output is correct
27 Correct 83 ms 205460 KB Output is correct
28 Correct 79 ms 205460 KB Output is correct
29 Correct 84 ms 205412 KB Output is correct
30 Correct 80 ms 205432 KB Output is correct
31 Correct 197 ms 205836 KB Output is correct
32 Correct 197 ms 205840 KB Output is correct
33 Correct 229 ms 205836 KB Output is correct
34 Correct 175 ms 205908 KB Output is correct
35 Correct 200 ms 205836 KB Output is correct
36 Correct 141 ms 205780 KB Output is correct
37 Correct 140 ms 205796 KB Output is correct
38 Correct 138 ms 205840 KB Output is correct
39 Correct 154 ms 205820 KB Output is correct
40 Correct 138 ms 205800 KB Output is correct
41 Correct 180 ms 205740 KB Output is correct
42 Correct 207 ms 205796 KB Output is correct
43 Correct 193 ms 205776 KB Output is correct
44 Correct 137 ms 205752 KB Output is correct
45 Correct 136 ms 205788 KB Output is correct
46 Correct 140 ms 205800 KB Output is correct
47 Correct 161 ms 205716 KB Output is correct
48 Correct 141 ms 205724 KB Output is correct
49 Correct 138 ms 205768 KB Output is correct
50 Correct 138 ms 205748 KB Output is correct
51 Correct 621 ms 205516 KB Output is correct
52 Correct 1700 ms 250820 KB Output is correct
53 Execution timed out 2054 ms 250700 KB Time limit exceeded
54 Halted 0 ms 0 KB -