[BZOJ1823][JSOI2010]满汉全席 && 2-sat

来源:互联网 发布:python 3 base64 编辑:程序博客网 时间:2024/04/27 17:10

PPT:http://wenku.baidu.com/view/afd6c436a32d7375a41780f2.html

这是道2-sat裸题吧 练手的

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<queue>#define SF scanf#define PF printfusing namespace std;typedef long long LL;const int MAXN = 1000;struct Node {    int v, next;} Edge[MAXN*2+10];int adj[MAXN+10], ecnt, dfn[MAXN+10], low[MAXN+10], SCC[MAXN+10], scc, dcnt;int Q[MAXN+10], top;int n, m;void add(int u, int v) {    Node &e = Edge[++ecnt];    e.v = v; e.next = adj[u]; adj[u] = ecnt;}void dfs(int u) {    low[u] = dfn[u] = ++dcnt;    Q[++top] = u;    for(int i = adj[u]; i; i = Edge[i].next) {        int v = Edge[i].v;        if(!dfn[v]) {            dfs(v);            low[u] = min(low[u], low[v]);        }        else if(!SCC[v]) low[u] = min(low[u], dfn[v]);    }    if(low[u] == dfn[u]) {        scc++;        int x;        do {            x = Q[top--];            SCC[x] = scc;        } while(x != u);    }}int main() {    int _T; SF("%d", &_T); while(_T--) {        ecnt = dcnt = scc = top = 0;        memset(adj, 0, sizeof(adj));        memset(dfn, 0, sizeof(dfn));        memset(low, 0, sizeof(low));        memset(SCC, 0, sizeof(SCC));        SF("%d%d", &n, &m);        for(int i = 1; i <= m; i++) {            int x, y, xx, yy;             char op1, op2;            SF(" %c%d %c%d", &op1, &xx, &op2, &yy);            if(op1 == 'm') xx = xx*2;            else xx = xx*2-1;            if(op2 == 'm') yy = yy*2;            else yy = yy*2-1;            if(xx & 1) x = xx+1;            else x = xx-1;            if(yy & 1) y = yy+1;            else y = yy-1;            add(xx, y); add(yy, x);        }        bool ok = true;        for(int i = 1; i <= 2*n; i++) if(!dfn[i]) dfs(i);        for(int i = 1; i <= n; i++)            if(SCC[i*2] == SCC[i*2-1]) {                ok = false; break;            }        if(ok) puts("GOOD");        else puts("BAD");    }    return 0;}


0 0
原创粉丝点击