D - Pair of Balls (atcoder.jp)
题意:
有2*n个球,每个球涂n种颜色,每种颜色恰好涂两个球,把这些球放进m个栈里,每次操作可以弹出两个相同颜色的球,问是否存在方案使得将所有栈清空
思路:
注意到,对于上下两层的球是有有向约束关系的,即上面那个球弹出之后下面那个球才能弹出
对于这种有向的约束关系,一个很好的想法是建有向图
对于这道题,上下两层建一条有向边,然后做一遍拓扑排序即可,如果不存在环,那么就说明有解,否则就是无解
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5+5;
int e[maxn],h[maxn],nex[maxn],id;
int ans,in[maxn];
queue<int>q;
void add(int x,int y){
e[++id]=y;
nex[id]=h[x];
h[x]=id;
}
int main(){
int n,m;
cin>>n>>m;
for(int j=1;j<=m;j++){
int k,pre,x;
cin>>k>>pre;
for(int i=2;i<=k;i++){
cin>>x;
add(x,pre);
in[pre]++;
pre=x;
}
}
for(int i=1;i<=n;i++){
if(in[i]==0)q.push(i);
}
while(q.size()){
int top=q.front();
q.pop();
ans++;
for(int i=h[top];i;i=nex[i]){
int j=e[i];
in[j]--;
if(in[j]==0)q.push(j);
}
}
if(ans==n)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}