[AGC027C]ABland Yard

Description

AGC027C
给定一张图,点有标号A或B,计算是否对于任意的一个由AB构成的字符串都在图中有对应的路径。

Solution

观察可以发现,如果有个环是AABB的无限循环,就输出Yes,否则输出No

然鹅,话是这么说,码却没有那么好写,我一开始写了dfs找环,但是一直WA,和标程对拍也拍不出来错。所以我就换了一种思路,借用拓扑排序的思想,每次将之与一种字符相连的点删去,如果删完还剩下,那么就说明有一个AABB的环,否则就没有。

Code

拓扑排序版:

#include <cstdio>
 
const int N = 2e5 + 10;
const int M = 4e5 + 10;
 
int hd[N], nxt[M], to[M], cnt;
int deg[N][2];
int n, m;
char col[N];
int q[N], qhd, qtl, vis[N];
 
inline void adde(int x, int y) {
    cnt++;
    to[cnt] = y; nxt[cnt] = hd[x]; 
    hd[x] = cnt;
}
 
int main() {
    scanf("%d%d", &n, &m);
    scanf("%s", col+1);
    for (int i = 1, x, y; i <= m; ++i) {
        scanf("%d%d", &x, &y);
        adde(x, y);
        adde(y, x);
        deg[x][col[y] == 'B']++;
        deg[y][col[x] == 'B']++;
    }
    for (int i = 1; i <= n; ++i) {
        if (deg[i][0] == 0 || deg[i][1] == 0) vis[q[qtl++] = i] = 1;
    }
    while (qhd != qtl) {
        int x = q[qhd++];
        // printf("%d\n", x);
        // vis[x] = 1;
        for (int i = hd[x]; i; i = nxt[i]) if (!vis[to[i]]) {
            if (--deg[to[i]][col[x] == 'B'] == 0) {
                vis[to[i]] = 1;
                q[qtl++] = to[i];
            } 
        }
    }
    if (qtl == n) puts("No");
    else puts("Yes");
}

并不知道有什么错WA个不停的dfs版:

#include <cstdio>
 
const int N = 2e5 + 10;
const int M = 4e5 + 10;
const char S[] = "ABBAA";
 
int hd[N], nxt[M], to[M], cnt;
char col[N];
int n, m, flag, pos;
 
inline void adde(int x, int y) {
    cnt++;
    nxt[cnt] = hd[x];
    to[cnt] = y;
    hd[x] = cnt;
}
 
inline void dfs(int x, int c, int nf) {
    if (flag) return;
    if (c == 0 && nf) {
        if (x == pos) flag = 1;
        return;
    }
    for (int i = hd[x]; i; i = nxt[i]) {
        if (col[to[i]] == S[c])
            dfs(to[i], (c+1)%4, 1);
    }
}
 
int main() {
    scanf("%d%d", &n, &m);
    scanf("%s", col+1);
    for (int i = 1, x, y; i <= m; ++i) {
        scanf("%d%d", &x, &y);
        adde(x, y);
        adde(y, x);
    }
    for (int i = 1; i <= n; ++i) {
        if (col[i] == 'A') {
            pos = i;
            dfs(i, 0, 0);
        } 
        if (flag) break;
    }
    printf(flag ? "Yes\n" : "No\n");
    return 0;
}

求查错或者给出一组数据卡掉这个程序。

猜你喜欢

转载自www.cnblogs.com/wyxwyx/p/agc027c.html