vector< int > adj[maxn]; string s[maxn]; // 0 not visited | 1 visiting | 2 visited // 我这里没开二维数组,用一维压缩了状态 (u, d) -> u * w + d int vis[maxn * 10]; int n, m, w;
booldfs( int uid ){ vis[uid] = 1;
// 解码出一维状态里对应的 u, d int u = uid / w; int d = uid % w; int nxt = (d + 1) % w;
// 停留原地 if( s[u][nxt] == 'o' ) { int vid = u * w + nxt; if( vis[vid] == 1 ) return1; if( vis[vid] == 0 ) if( dfs( vid ) ) return1; }
// 去相邻城市 for( int v : adj[u] ) { if( s[v][nxt] == 'o' ) { int vid = v * w + nxt; if( vis[vid] == 1 ) return1; if( vis[vid] == 0 ) if( dfs( vid ) ) return1; } } vis[uid] = 2; return0; }
voidsolve( ){ cin >> n >> m;
for( int i = 0; i < n; ++ i ) adj[i].clear( );
for( int i = 0; i < m; ++ i ) { int u, v; cin >> u >> v; // 使用 0-index 是为了方便后续压缩成一维状态时的除法和取模运算 u --, v --; adj[u].push_back( v ); adj[v].push_back( u ); }
cin >> w; for( int i = 0; i < n; ++ i ) cin >> s[i];
int tot = n * w; fill( vis, vis + tot, 0 );
for( int i = 0; i < n; ++ i ) { // 从每个第一天就放假的城市出发 if( s[i][0] == 'o' ) { int stid = i * w + 0; if( vis[stid] == 0 ) { if( dfs( stid ) ) { cout << "Yes" << '\n'; return; } } } } cout << "No" << '\n'; return; }