1 条题解
-
0

#include <cstdio> #include <vector> #include <iostream> #include <queue> using namespace std; const int M = 5005; #define pb push_back int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,m,k,a[M],b[M],c[M],fa[M][2];bool f[M][M]; vector<int> g[M],G[M]; struct node{int x,y;};queue<node> q; int find(int x,int t) { if(fa[x][t]==x) return x; return fa[x][t]=find(fa[x][t],t); } void dfs(int u,int w) { c[u]=w; for(int v:G[u]) { if(!c[v]) dfs(v,-w); else if(c[v]==w) b[w>0?w:-w]=1; } } signed main() { n=read();m=read();k=read(); for(int i=1;i<=n;i++) { scanf("%1d",&a[i]); f[i][i]=1;q.push({i,i}); fa[i][0]=fa[i][1]=i; } for(int i=1;i<=m;i++) { int u=read(),v=read(); if(a[u]!=a[v]) { int x=find(u,0),y=find(v,0); if(x==y) continue;fa[x][0]=y; g[u].pb(v);g[v].pb(u); } else { int x=find(u,1),y=find(v,1); G[u].pb(v);G[v].pb(u); if(x==y) continue;fa[x][1]=y; g[u].pb(v);g[v].pb(u); f[u][v]=f[v][u]=1;q.push({u,v}); } } for(int i=1;i<=n;i++) if(!c[i]) dfs(i,i); for(int i=1;i<=n;i++) if(b[i]) g[i].pb(i); while(!q.empty()) { int u=q.front().x,v=q.front().y;q.pop(); for(int x:g[u]) for(int y:g[v]) if(a[x]==a[y] && !f[x][y]) q.push({x,y}),f[x][y]=f[y][x]=1; } while(k--) { int u=read(),v=read(); puts(f[u][v]?"YES":"NO"); } }
- 1
信息
- ID
- 2400
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者