60分求助

P4171 [JSOI2010] 满汉全席

是青白呀 @ 2021-12-09 17:12:46

4#6#7#9WA

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
struct edge{
    int to,next;
}e[2005];
int first[205],oth[205],np=0,nownum=0;
bool vis[205];
stack<int>stk;

void add(int x,int y){
    e[++np]=(edge){y,first[x]};
    first[x]=np;
}

bool dfs(int i){
    if(vis[i])return 1;
    if(vis[oth[i]])return 0;
    stk.push(i);
    vis[i]=1;
    nownum++;
    for(int p=first[i];p;p=e[p].next)
        if(!dfs(e[p].to))return 0;
    return 1;
}

int main(){
    scanf("%d",&k);
    while(k){
        bool ok=1;
        memset(first,0,sizeof(first));
        memset(oth,0,sizeof(oth));
        while(!stk.empty())stk.pop();
        np=0;
        nownum=0;
        memset(vis,0,sizeof(vis));
        k--;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            oth[i]=i+n;
        for(int i=n+1;i<=2*n;i++)
            oth[i]=i-n;
        getchar();
        for(int i=1;i<=m;i++){
            char s[6];
            gets(s);
            int a,b;
            a=s[1]-'0';
            b=s[4]-'0';
            if(s[0]=='m'&&s[3]=='m'){
                add(a+n,b);
                add(b+n,a);
            }
            if(s[0]=='m'&&s[3]=='h'){
                add(a+n,b+n);
                add(b,a);
            }
            if(s[0]=='h'&&s[3]=='m'){
                add(a,b);
                add(b+n,a+n);
            }
            if(s[0]=='h'&&s[3]=='h'){
                add(a,b+n);
                add(b,a+n);
            }
        }

        for(int i=1;i<=n;i++){
            if(vis[i]||vis[oth[i]])continue;
            nownum=0;
            if(!dfs(i)){
                for(int j=1;j<=nownum;j++){
                    int x;
                    x=stk.top();
                    stk.pop();
                    vis[x]=0;
                }
                nownum=0;
                if(!dfs(oth[i])){
                    printf("BAD");
                    ok=0;
                    break;
                }
            }
        }
        if(ok)printf("GOOD");
        printf("\n");
    }
    return 0;
}

by tin_ingot @ 2021-12-09 18:27:15

求题目


|