洛谷题解-P2712 摄像头 (拓扑排序)

https://www.luogu.com.cn/problem/P2712

可以看出是拓扑排序,因为是有前后关系的,但是坑点在于点并不连续,值得记录一下(刚开始70分,后来才AC)

注意坑点:拓扑排序,遍历的点不连续

 

#include <bits/stdc++.h>
using namespace std;

const int N=1e5+5;
int n, x, m, y, d[N], cnt=0, vis[N], Max=0;
vector<int> a[N];
queue<int> q;
int main()
{
	scanf("%d", &n);
	for (int i=1; i<=n; i++)
	{
		scanf("%d%d", &x, &m);
		vis[x]=1; //有这个点
		for (int j=1; j<=m; j++)
		{
			scanf("%d", &y);
			a[x].push_back(y);
			d[y]++;
		}
		Max=max(x, Max); //最大点数
	}
	
	for (int i=1; i<=Max; i++) //因为不连续,所以要用Max记录最大点数
		if (d[i]==0 && vis[i]) q.push(i); //有这个点,才可以用
	while (!q.empty())
	{
		int u=q.front();
		q.pop();
	//	cout<<u<<endl;
		if (vis[u]) cnt++; //有这个点
		
		for (int i=0; i<a[u].size(); i++)
		{
			int v=a[u][i];
			d[v]--;
			if (d[v]==0) q.push(v);
		}
	}
	
	if (cnt<n) printf("%d", n-cnt); //求的是还没砸掉的摄像头的数量
	else printf("YES");
	return 0;
}

 

posted @ 2024-01-26 19:03  cn是大帅哥886  阅读(106)  评论(0)    收藏  举报