1. 程式人生 > >題解 CF475B 【Strongly Connected City】

題解 CF475B 【Strongly Connected City】

這道題思路有三種:

1.

我們看到

2 <= n, m <= 20

資料範圍不是很大,交點大約400,可以試著每個點dfs一次,然後找是否有一次都能到達其他點

2.

有些大佬會說:

這不就是強聯通分量水題嗎?

所以可以用Tarjan來求

3.

主要思路:瞎搞

怎麼瞎搞??

我們可以仔細考慮一下,如果我們除了最外層的邊以外,都可以通過最外層邊到達各個邊的話,那這個圖是不是肯定是強聯通的?

那如果最外層都不是互聯通的話,就肯定不符合題意。

所以我們只需要判斷一下最外層的街道是不是連通的就好了。

沒看懂自己感性理解下

所以我只給出第三種解法的程式碼:(除輸入外時間複雜度O(1))

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define go(i, j, n, k) for (int i = j; i <= n; i += k)
#define fo(i, j, n, k) for (int i = j; i >= n; i -= k)
#define rep(i, x) for (int i = h[x]; i; i = e[i].nxt)
#define mn 22
#define inf 2147483647
#define ll long long
#define ld long double
#define fi first
#define se second
#define root 1, n, 1
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define bson l, r, rt
//#define LOCAL
#define mod 
#define Debug(...) fprintf(stderr, __VA_ARGS__)
inline int read(){
    int f = 1, x = 0;char ch = getchar();
    while (ch > '9' || ch < '0'){if (ch == '-')f = -f;ch = getchar();}
    while (ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}
    return x * f;
}
//This is AC head above...
int n, m, heng[mn], shu[mn];
char h[mn << 2], s[mn << 2];
int main(){
    n = read(), m = read();
    scanf("%s", h + 1);
    go(i, 1, n, 1){
        heng[i] = h[i] == '<' ? 0 : 1; // 0 -> zuo 1 -> you
    }
    scanf("%s", s + 1);
    go(i, 1, m, 1) {
        shu[i] = s[i] == '^' ? 0 : 1; // 0 -> shang 1 -> xia
    }
    if((heng[1] == 1 && heng[n] == 0 && shu[1] == 0 && shu[m] == 1) || (heng[1] == 0 && heng[n] == 1 && shu[1] == 1 && shu[m] == 0)) 
    {
        puts("YES");
    }
    else
    {
        puts("NO");
    }
#ifdef LOCAL
    Debug("\nMy Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
    return 0;
}