求助 AtCoder Beginner 216 D题这个代码为什么过不去?
  • 板块灌水区
  • 楼主zifanwang
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/8/29 22:07
  • 上次更新2023/11/4 08:35:50
查看原帖
求助 AtCoder Beginner 216 D题这个代码为什么过不去?
329857
zifanwang楼主2021/8/29 22:07
#include<bits/stdc++.h>
using namespace std;
int n,m,tot,cnt,t[400002],v[800003],nx[800003],hd[400003];
int g[200002][2];
int b[400002];
inline void add(int x,int y){
	v[++tot]=y,nx[tot]=hd[x],hd[x]=tot;
}
void dfs(int x,int h){
	b[x]=h;
	for(int i=hd[x];i;i=nx[i]){
		if(b[v[i]]==h){puts("No");exit(0);}
		if(!b[v[i]])dfs(v[i],h);
	}
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=0,k;i<m;++i){
		scanf("%d",&k);
		for(int j=0,c;j<k;++j){
			scanf("%d",&c);
			cnt++;
			t[cnt]=j?cnt-1:0;
			if(g[c][0])g[c][1]=cnt;
			else g[c][0]=cnt;
		}
	}
	for(int i=1;i<=cnt;++i)
		if(t[i])add(i,t[i]);
	for(int i=1;i<=n;++i){
		if(t[g[i][0]])add(g[i][1],t[g[i][0]]);
		if(t[g[i][1]])add(g[i][0],t[g[i][1]]);
	}
	for(int i=1;i<=cnt;++i)if(!b[i])dfs(i,i);
	puts("Yes");
    return 0;
}

其中如果a和b之间有边,就说明要删除a就得先删除b。

然后再判断有没有出现环

2021/8/29 22:07
加载中...