社区讨论

蒟蒻求调,只用了拓扑

CF1547G How Many Paths?参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo7kyb84
此快照首次捕获于
2023/10/27 03:31
2 年前
此快照最后确认于
2023/10/27 03:31
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

const int N=4e5+10,M=4e5+10;
int n,m;
int to[M],nxt[M],h[N],tot,deg[N];
int v[N];//有限可到
int cnt[N];//到过几次
int V[N];//BFS可到

void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
	deg[y]++;
}

void topsort()
{
	queue<int> q;
	q.push(0);
	v[0]=1;
	cnt[0]++;
	while(q.size())
	{
		int x=q.front();q.pop();
		for(int i=h[x];i;i=nxt[i])
		{
			int y=to[i];
			cnt[y]++;
			if(--deg[y]==0)
			{
				q.push(y);
				v[y]=1;
			}
		}
	}
}

void BFS()
{
	queue<int> q;
	q.push(1);
	V[1]=1;
	while(q.size())
	{
		int x=q.front();q.pop();
		for(int i=h[x];i;i=nxt[i])
		{
			int y=to[i];
			if(!V[y])q.push(y),V[y]=1;
		}
	}
}

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		for(int i=0;i<=n;i++)
		{
			cnt[i]=v[i]=V[i]=h[i]=deg[i]=0;
		}
		tot=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
	}
	add(0,1);
	BFS();
	for(int i=1;i<=n;i++)
	{
		if(!V[i])
		{
			for(int j=h[i];j;j=nxt[j])
			{
				deg[to[j]]--;
			}
		}
	}
	topsort();
	for(int i=1;i<=n;i++)
	{
		if(!v[i]&&V[i])
		{
			cout<<-1<<" ";
			continue;
		}
		if(!V[i])
		{
			cout<<0<<" ";
			continue;
		}
		if(v[i]&&cnt[i]==1)
		{
			cout<<1<<" ";
			continue;
		}
		if(v[i]&&cnt[i]>1)
		{
			cout<<2<<" ";
			continue;
		}
	}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...