zoj 3509

来源:互联网 发布:bae 数据库 编辑:程序博客网 时间:2024/09/21 06:18

题目大意:

N个点,M次加边/删边/询问两点连通性操作,初始图为空。N<=500,M<=50000,每条边最多加一次。

题解:

想什么呢,大力bitset!N*N*M/32花式水过!

附代码:

#include<bits/stdc++.h>#define N 510using namespace std;bitset<N> s[N],ned,now,emp;int n,m;inline bool query(int a,int b){ned=now=s[a];ned[a]=0;int ta;while((ta=ned._Find_first())!=N){ned[ta]=0;ned|=(now|s[ta])^now;now|=s[ta];if(now[b]) return 1;}return now[b];}int main(){char ch[5];int a,b;int tot=0;while(~scanf("%d%d",&n,&m)){if(tot) puts("");for(int i=0;i<n;i++){s[i]=emp;s[i][i]=1;}printf("Case %d:\n",++tot);while(m--){scanf("%s%d%d",ch,&a,&b);a--,b--;if(ch[0]=='I') s[a][b]=s[b][a]=1;else if(ch[0]=='D') s[a][b]=s[b][a]=0;else{if(a==b) puts("YES");else if(query(a,b)) puts("YES");else puts("NO");}}}return 0;}


原创粉丝点击