題解 CF475B 【Strongly Connected City】
阿新 • • 發佈:2018-12-03
這道題思路有三種:
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; }