[CQOI2013]图的逆变换

传送门

题不难,但性质很难想(老子模拟赛时没看懂……)

用了一个新玩意(bitset)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<stack>
#include<bitset>
using namespace std;
struct node{
    int to,nxt;
}a[1000001];
int head[100001],N;
bitset<301> F;
int add(int X,int Y){
    a[++N].to=Y;
    a[N].nxt=head[X];
    head[X]=N;
    return 0; 
}
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<1)+(s<<3)+(ch^48);
        ch=getchar();
    }
    return s*w;
}
bitset<301> b[301];
int main(){
    int T=read();
    while(T--){
        int n=read(),m=read();
        for(int i=1;i<=n;i++) b[i].reset();
        N=0;
        memset(head,0,sizeof(head));
        for(int i=1;i<=m;i++){
            int X=read(),Y=read();
            X++;
            Y++; 
            b[X].set(Y);
            add(Y,X);
        }
        int flag=0;
        for(int i=1;i<=n;i++){
            int front=-1;
            F.reset();
            for(int j=head[i];j;j=a[j].nxt){
                int To=a[j].to;
                if(front==-1){
                    front=0;
                    F=b[To];
                }
                else if(F!=b[To]) flag=1;
                if(flag==1) break;
            }
            if(flag==1) break;
        }
        if(flag==1) printf("No\n");
        else printf("Yes\n");
    }
    
    return 0;
}

 

posted @ 2021-11-11 19:24  latent_Lin  阅读(29)  评论(0编辑  收藏  举报