ようこそ私Luoguスペース。
[タイトル]効果
無向グラフ、辺の長さである\(1 \) 、各点が染色される( "R、B、Y \ 、G" \) の4つの色。
ルールを旅図は次のとおりです。4段階のサイクル毎、最初の段階からスタート、毎週の4つのステップは、最後のいくつかの完全なサイクルが同じ色を踏むことができない、最初の一歩を数えていない(初期位置以上の異なる色を踏む必要があります)。
最初は今\(K \)個人はあなたが最短距離を見つけた場合、彼らは、同じ点に収束させることができるかどうか尋ねる、異なる出発点にありました。
[説明]
成形圧力BFS +。
二進数(0001,0010,0100,1000 \)\何かと色を踏ん表します。
\(k個の\)特定の点であることが見出された場合、広い探索点、検索処理を実行するために一緒に\(k個の\)個人が合格したが、その後、走行距離の現在の状態が最短距離です。私は、彼らが収束しないことを見つけることができませんでした。
異なる状態は、プログラムが異なるの後に行くために、同じポイントに来るので、それは、ポイントの状態によって再宣告しなければなりません。
[コード]
// output format !!
// long long !!
#include <bits/stdc++.h>
#define H puts("HYX")
const int MAXN = 50000+10;
struct DATA{
int x, id, len, f;
void build(int _x, int _id, int _c){
this->f = 0, this->x = _x, this->id = _id;
this->f = _c, this->len = 0;
}
};
int n, m, k, f1[MAXN][15][20], f2[MAXN][15], cnt[MAXN], c[MAXN], s[15];
int hed[MAXN], nex[MAXN*100], e[MAXN*100], ct;
char in[MAXN];
std::queue<DATA> Q;
int bfs(){
while(!Q.empty()){
DATA x = Q.front(); Q.pop();
for(int i=hed[x.x]; i; i=nex[i]){
DATA y = x;
if((y.f&c[e[i]])) continue;
if(f1[e[i]][y.id][y.f|=c[e[i]]]) continue;
if(!f2[e[i]][y.id]) f2[e[i]][y.id] = 1, ++cnt[e[i]];
if(cnt[e[i]] == k) return y.len+1;
if(y.f == 15) y.f = 0;
f1[e[i]][y.id][y.f] = 1;
++y.len, y.x = e[i];
Q.push(y);
}
}
return -1;
}
int main(){
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
scanf("%d%d%d%d", &n, &n, &m, &k);
for(int i=1; i<=k; ++i) scanf("%d", s+i);
scanf("%s", in+1);
for(int i=1; i<=n; ++i){
if(in[i] == 'R') c[i] = 1;
if(in[i] == 'B') c[i] = 2;
if(in[i] == 'Y') c[i] = 4;
if(in[i] == 'G') c[i] = 8;
}
for(int i=1; i<=k; ++i){
DATA a; a.build(s[i], i, c[s[i]]);
cnt[s[i]] = f2[s[i]][i] = 1, Q.push(a);
}
while(m--){
int a, b; scanf("%d%d", &a, &b);
e[++ct] = b, nex[ct] = hed[a], hed[a] = ct;
e[++ct] = a, nex[ct] = hed[b], hed[b] = ct;
}
printf("%d", bfs());
return 0;
}