BFS
単一始点最短経路問題で、すべての頂点に最短で到達するのに必要な辺だけを選ぶと木になることが知られている(最短経路木)。 なので、この問題では最短経路木を列挙すればいいことがわかる。根でない頂点vに最短距離で到達した時、直前の頂点をuとする。d(x)…
各商品をスタート地点として見てBFSっぽいことをする。はじめにキューへすべての始点入れておくだけ。 int N, M, K, S; vi G[100005]; int dis[100005][102]; vi pos[102]; void bfs(int kind) { queue<pii> Q; each(p, pos[kind]) { Q.push({ p,0 }); dis[p][kin</pii>…
http://codeforces.com/blog/entry/59484?#comment-431237 これを見てそのとおりに書いた。 using P = array<int, 7>; static bitset<2001> vis[10][10][10][10][10]; int N; cin >> N; vi A(N), B(N); rep(a, N)cin >> A[a] >> B[a]; queue<P> Q; Q.push({ 0,0,0,0,1,0</p></int,>…
コメント付きコード // 頂点の数、色の数、頂点vに含まれるアイスの数 int N, M, S[300001]; // グラフ, 頂点vに含まれるアイス vi G[300001], C[300001]; // 解, 色iを使ったかどうか int X[300001], use[300001]; int main(){ scanf("%d%d", &N, &M); rep(…
1個の町に複数の警察署がある場合もありうるが、明らかに無意味なので1個の町にはたかだか1個の警察署しか無いとする。 道路で結ばれた町は、全体で木になっている。 ある頂点が複数の警察署でカバーされているとする。そのうち最も近い頂点をu,二番目に近い…