2333。 。
TC エントリの数が少なく、fst が一定であるため、div2 に落としました。
幸いなことに、終了後は div1 に戻りました。 。
250
水の質問
500
水の質問。 。
bfs を直接展開するだけです
判定に注意してください。展開するために Cantor も使用しましたが、これは本当に不要です。 。
1000
この質問の意味を誤解していました。 。他の人のコードを見ると何かが正しくないと言いました
しかし、それはまだ非常に簡単な質問です
どのリーフノードを書き込むかのバイナリ列挙
次に、各書き込み方法の最短パスを見つけます
最短を見つけた後パス、エッジを列挙します
エッジの 2 つのノードが u で、v の重みが w であると仮定します
バーンアウトする時間である最大値 (dis[u]+dis[v]+w )/2 を見つけます
これはなぜですか?
ある面が最後に焼かれると仮定すると、2つの状況があります
1つは、uとvの両方が他のノードからの火によって焼かれるということです
1つは、あなたが焼かれるということです火v から
最初の方法、dis[u] > dis[v] と仮定しましょう
答えは ( L-(dis[u] - dis[v]) ) / 2 + dis[u ] = (dis [u] + dis[v] + L) / 22 番目の
dis[v] + L = dis[u]
次に、同じ dis[u] = (dis[v] + L + dis[u) ]) / 2
どちらもこれで表すことができます
では便宜上2で割ることはしません
struct node { int v, w; node () {} node (int _v, int _w) {v = _v; w = _w;}};vector<node>g[22];int ind[22], lea[22], pos[22], d[22], vis[22], q[1111];set<int> s;class CandleTimerEasy{public: int differentTime(vector <int> A, vector <int> B, vector <int> len) { int n = A.size() + 1; for(int i = 0; i < n; i++) g[i].clear(); memset(ind, 0, sizeof(ind)); for(int i = 0; i < n - 1; i++) { g[A[i]].push_back(node(B[i], len[i])); g[B[i]].push_back(node(A[i], len[i])); ++ind[A[i]]; ++ind[B[i]]; } s.clear(); int cnt = 0; memset(pos, -1, sizeof(pos)); for(int i = 0; i < n; i++) { if(ind[i] == 1) { lea[cnt] = i; pos[i] = cnt; cnt++; } } for(int sta = 1; sta < (1 << cnt); sta ++) { int h = 0, t = 0; for(int i = 0; i < n; i++) { d[i] = INF; vis[i] = 0; if(pos[i] != -1) { if(sta & (1 << pos[i])) { q[t++] = i; d[i] = 0; vis[i] = 1; } } } while(h < t) { int u = q[h++]; vis[u] = 0; for(int i = 0; i < g[u].size(); i++) { int v = g[u][i].v; int w = g[u][i].w; if(d[u] + w < d[v]) { d[v] = d[u] + w; if(!vis[v]) { q[t++] = v; vis[v] = 1; } } } } int mx = 0; for(int i = 0; i < n - 1; i++) mx = max(mx, d[A[i]] + d[B[i]] + len[i]); s.insert(mx); } return (int)s.size(); }}