P2712

摄像头

题目描述

食品店里有 \(n\) 个摄像头,这种摄像头很笨拙,只能拍摄到固定位置。现有一群胆大妄为的松鼠想要抢劫食品店,为了不让摄像头拍下他们犯罪的证据,他们抢劫前的第一件事就是砸毁这些摄像头。

为了便于砸毁摄像头,松鼠歹徒们把所有摄像头和摄像头能监视到的地方统一编号,一个摄像头能被砸毁的条件是该摄像头所在位置不被其他摄像头监视。

现在你的任务是帮松鼠们计算是否可以砸掉所有摄像头,如不能则输出还没砸掉的摄像头的数量。

输入格式

\(1\) 行,一个整数 \(n\),表示摄像头的个数。

\(2\)\(n+1\) 行是摄像头的信息,包括:摄像头的位置 \(x\),以及这个摄像头可以监视到的位置数 \(m\),之后 \(m\) 个数 \(y\) 是此摄像头可以监视到的位置。(砸了这些摄像头之后自然这些位置就监视不到了)

输出格式

若可以砸掉所有摄像头则输出“ \(\texttt{YES}\) ”,否则输出还没砸掉的摄像头的数量。(不带引号)

样例 #1

样例输入 #1

5
1 1 2
2 1 1
3 1 7
4 1 1
5 0

样例输出 #1

2

提示

\(1 \leq n \leq 100\)

\(0 \leq m \leq 100\)

\(0 \leq x,y \leq 500\)


正解是用topsort做
但是我用dfs乱搞骗了80pts 也不知道哪里错了 先贴着吧 以后来补
80pts:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>can[1005];
int pd[1005],ans,vis[1005],pdd[1005];
void dfs(int step,int cnt)
{
//	cout<<step<<"\n";
	if(!pd[step])return ;
	ans=max(ans,cnt);
	
	for(int i=0;i<can[step].size();i++)
	{
		int y=can[step][i];
		pd[y]=1;
	}
	vis[step]=1;
	for(int i=1;i<=n;i++)
	{
		if(i==step)continue;
		if(!vis[i])
		{
			dfs(i,cnt+1);
		}
	}
	for(int i=0;i<can[step].size();i++)
	{
		int y=can[step][i];
		if(pdd[y])
			pd[y]=0;
	}
	vis[step]=0;
	
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int m,x,y;
		cin>>x>>m;
		for(int j=1;j<=m;j++)
		{
			cin>>y;
//			cout<<x<<"  "<<y<<"\n";
			pdd[y]=1;
			can[x].push_back(y);
		}
	}
	for(int i=1;i<=n;i++)
	{
		memset(vis,0,sizeof(vis));
		memset(pd,0,sizeof(pd));
		for(int j=1;j<=n;j++)
			if(!pdd[j])
				pd[j]=1;
		dfs(i,0);
	}
	if(ans==n)cout<<"YES\n";
	else cout<<n-ans<<"\n";
	return 0;
}
posted @ 2023-01-06 12:47  PKU_IMCOMING  阅读(12)  评论(0)    收藏  举报