답안 #635437

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
635437 2022-08-26T09:10:50 Z S2speed LOSTIKS (INOI20_lostiks) C++17
59 / 100
2000 ms 231928 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;
typedef pair<pii , int> piii;

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

int n , s , t;
pii adj[maxn << 1];
piii ed[maxn];
int dg[maxn] , st[maxn] , ft[maxn] , x[maxn];
int dis[22][maxn];
int bfs[maxn] , sz = 0;
int g[maxn] , k[22] , d[22] , e[22] , f[22][22] , dp[maxn][22] , ind[22];

void rBFS(int r , int h){
	sz = 0;
	dis[h][r] = 0;
	g[r] = 0;
	bfs[sz++] = r;
	int x = 0;
	while(x < sz){
		int v = bfs[x++];
		for(int e = st[v] ; e < ft[v] ; e++){
			pii p = adj[e];
			int i = p.first , t = p.second;
			if(dis[h][i] < dis[h][v] + 1) continue;
			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;
}

void BFS(int r , int h){
	sz = 0;
	dis[h][r] = 0;
	g[r] = 0;
	bfs[sz++] = r;
	int x = 0;
	while(x < sz){
		int v = bfs[x++];
		for(int e = st[v] ; e < ft[v] ; e++){
			pii p = adj[e];
			int i = p.first , t = p.second;
			if(dis[h][i] < dis[h][v] + 1) continue;
			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--;
		dg[v]++; dg[u]++;
		if(w != -1){
			k[m] = w;
			ed[i] = {{v , u} , m};
			m++;
		} else {
			ed[i] = {{v , u} , -1};
		}
	}
	x[0] = st[0] = 0; ft[0] = dg[0];
	for(int i = 1 ; i < n ; i++){
		x[i] = st[i] = ft[i - 1]; ft[i] = st[i] + dg[i];
	}
	for(int e = 1 ; e < n ; e++){
		piii p = ed[e];
		int v = p.first.first , u = p.first.second , w = p.second;
		adj[x[v]++] = {u , w}; adj[x[u]++] = {v , w};
	}
	rBFS(s , m);
	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]];
		}
	}
	for(int i = 0 ; i < m ; i++){
		for(int j = 0 ; j < m ; j++){
			f[i][j] = dis[i][k[j]] + dis[j][k[j]];
		}
	}
	int lm = (1 << m);
	for(int mask = 3 ; mask < lm ; mask++){
		int bp = 0;
		for(int j = 0 ; j < m ; j++){
			if(mask & (1 << j)) ind[bp++] = j;
		}
		if(bp == 1) continue;
		for(int jj = 0 ; jj < bp ; jj++){
			int j = ind[jj];
			if((e[j] & mask) != e[j]) continue;
			int h = inf , msk = mask ^ (1 << j);
			for(int ii = 0 ; ii < bp ; ii++){
				int i = ind[ii];
				if(i == j) continue;
				h = min(h , dp[msk][i] + f[i][j]);
			}
			dp[mask][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;
}

Compilation message

Main.cpp: In function 'void BFS(int, int)':
Main.cpp:57:22: warning: unused variable 't' [-Wunused-variable]
   57 |    int i = p.first , t = p.second;
      |                      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 180896 KB Output is correct
2 Correct 72 ms 181020 KB Output is correct
3 Correct 108 ms 186060 KB Output is correct
4 Correct 111 ms 186016 KB Output is correct
5 Correct 110 ms 185996 KB Output is correct
6 Correct 109 ms 186036 KB Output is correct
7 Correct 127 ms 186016 KB Output is correct
8 Correct 105 ms 185936 KB Output is correct
9 Correct 107 ms 185988 KB Output is correct
10 Correct 113 ms 185980 KB Output is correct
11 Correct 114 ms 186064 KB Output is correct
12 Correct 122 ms 185996 KB Output is correct
13 Correct 122 ms 186056 KB Output is correct
14 Correct 114 ms 186032 KB Output is correct
15 Correct 107 ms 186012 KB Output is correct
16 Correct 121 ms 186064 KB Output is correct
17 Correct 123 ms 186044 KB Output is correct
18 Correct 115 ms 186004 KB Output is correct
19 Correct 113 ms 186044 KB Output is correct
20 Correct 123 ms 186012 KB Output is correct
21 Correct 113 ms 186016 KB Output is correct
22 Correct 72 ms 180836 KB Output is correct
23 Correct 68 ms 180852 KB Output is correct
24 Correct 70 ms 180936 KB Output is correct
25 Correct 68 ms 180884 KB Output is correct
26 Correct 67 ms 180896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 72 ms 180956 KB Output is correct
2 Correct 65 ms 180832 KB Output is correct
3 Correct 75 ms 180940 KB Output is correct
4 Correct 85 ms 180844 KB Output is correct
5 Correct 153 ms 181188 KB Output is correct
6 Correct 132 ms 181324 KB Output is correct
7 Correct 154 ms 181312 KB Output is correct
8 Correct 138 ms 181272 KB Output is correct
9 Correct 146 ms 181312 KB Output is correct
10 Correct 132 ms 181312 KB Output is correct
11 Correct 122 ms 181196 KB Output is correct
12 Correct 115 ms 181296 KB Output is correct
13 Correct 116 ms 181324 KB Output is correct
14 Correct 117 ms 181196 KB Output is correct
15 Correct 155 ms 181308 KB Output is correct
16 Correct 154 ms 181196 KB Output is correct
17 Correct 145 ms 181384 KB Output is correct
18 Correct 116 ms 181308 KB Output is correct
19 Correct 135 ms 181324 KB Output is correct
20 Correct 119 ms 181312 KB Output is correct
21 Correct 119 ms 181208 KB Output is correct
22 Correct 127 ms 181324 KB Output is correct
23 Correct 117 ms 181204 KB Output is correct
24 Correct 126 ms 181340 KB Output is correct
25 Correct 361 ms 180944 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 180896 KB Output is correct
2 Correct 72 ms 181020 KB Output is correct
3 Correct 108 ms 186060 KB Output is correct
4 Correct 111 ms 186016 KB Output is correct
5 Correct 110 ms 185996 KB Output is correct
6 Correct 109 ms 186036 KB Output is correct
7 Correct 127 ms 186016 KB Output is correct
8 Correct 105 ms 185936 KB Output is correct
9 Correct 107 ms 185988 KB Output is correct
10 Correct 113 ms 185980 KB Output is correct
11 Correct 114 ms 186064 KB Output is correct
12 Correct 122 ms 185996 KB Output is correct
13 Correct 122 ms 186056 KB Output is correct
14 Correct 114 ms 186032 KB Output is correct
15 Correct 107 ms 186012 KB Output is correct
16 Correct 121 ms 186064 KB Output is correct
17 Correct 123 ms 186044 KB Output is correct
18 Correct 115 ms 186004 KB Output is correct
19 Correct 113 ms 186044 KB Output is correct
20 Correct 123 ms 186012 KB Output is correct
21 Correct 113 ms 186016 KB Output is correct
22 Correct 72 ms 180836 KB Output is correct
23 Correct 68 ms 180852 KB Output is correct
24 Correct 70 ms 180936 KB Output is correct
25 Correct 68 ms 180884 KB Output is correct
26 Correct 67 ms 180896 KB Output is correct
27 Correct 72 ms 180956 KB Output is correct
28 Correct 65 ms 180832 KB Output is correct
29 Correct 75 ms 180940 KB Output is correct
30 Correct 85 ms 180844 KB Output is correct
31 Correct 153 ms 181188 KB Output is correct
32 Correct 132 ms 181324 KB Output is correct
33 Correct 154 ms 181312 KB Output is correct
34 Correct 138 ms 181272 KB Output is correct
35 Correct 146 ms 181312 KB Output is correct
36 Correct 132 ms 181312 KB Output is correct
37 Correct 122 ms 181196 KB Output is correct
38 Correct 115 ms 181296 KB Output is correct
39 Correct 116 ms 181324 KB Output is correct
40 Correct 117 ms 181196 KB Output is correct
41 Correct 155 ms 181308 KB Output is correct
42 Correct 154 ms 181196 KB Output is correct
43 Correct 145 ms 181384 KB Output is correct
44 Correct 116 ms 181308 KB Output is correct
45 Correct 135 ms 181324 KB Output is correct
46 Correct 119 ms 181312 KB Output is correct
47 Correct 119 ms 181208 KB Output is correct
48 Correct 127 ms 181324 KB Output is correct
49 Correct 117 ms 181204 KB Output is correct
50 Correct 126 ms 181340 KB Output is correct
51 Correct 361 ms 180944 KB Output is correct
52 Correct 1353 ms 231856 KB Output is correct
53 Correct 1698 ms 231928 KB Output is correct
54 Correct 1817 ms 231804 KB Output is correct
55 Correct 1154 ms 231812 KB Output is correct
56 Correct 1591 ms 231912 KB Output is correct
57 Correct 1575 ms 231880 KB Output is correct
58 Correct 68 ms 180940 KB Output is correct
59 Correct 73 ms 180844 KB Output is correct
60 Correct 65 ms 180880 KB Output is correct
61 Correct 798 ms 231892 KB Output is correct
62 Execution timed out 2086 ms 231692 KB Time limit exceeded
63 Halted 0 ms 0 KB -