坑点提示(我第一次被坑80分)
查看原帖
坑点提示(我第一次被坑80分)
1037870
jianxing04楼主2024/1/25 20:12

这道题就是拓扑排序,坑点有以下两点: 1.监控照的地方不一定有监控,即你需要判断被监控位置有没有监控之后,在考虑是否要将那个点加入拓扑排序; 2.第i个点的位置不一定为i。 我80的代码如下

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,ru[509],chu[509],ans;
vector<int> p[509];
queue<int> q;
bool ok[509];
int main()
{
	cin>>n;
	ans=n;
	for (int i=1;i<=n;i++)
	{
		cin>>x>>m;
		chu[i]=m;
		ok[x]=1;
		for (int j=1;j<=m;j++)
		{
			cin>>y;
			ru[y]++;
			p[i].push_back(y);
		}
	}
	for (int i=1;i<=n;i++)
	{
		if (ru[i]==0)
		{
			q.push(i);
			ans--;
		}
	}
	while(!q.empty())
	{
		int tem=q.front();
		q.pop();
		for (int i=0;i<p[tem].size();i++)
		{
			ru[p[tem][i]]--;
			if (ru[p[tem][i]]==0&&ok[p[tem][i]])
			{
				q.push(p[tem][i]);
				ans--;
			}
		}
	}
	if (ans)
	{
		cout<<ans;
	}
	else
	{
		cout<<"YES";
	}
	return 0;
}

修改成如下就过了

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,ru[509],chu[509],ans,wz[509];
vector<int> p[509];
queue<int> q;
bool ok[509];
int main()
{
	cin>>n;
	ans=n;
	for (int i=1;i<=n;i++)
	{
		cin>>x>>m;
		wz[i]=x;
		chu[x]=m;
		ok[x]=1;
		for (int j=1;j<=m;j++)
		{
			cin>>y;
			ru[y]++;
			p[x].push_back(y);
		}
	}
	for (int i=1;i<=n;i++)
	{
		if (ru[wz[i]]==0)
		{
			q.push(wz[i]);
			ans--;
		}
	}
	while(!q.empty())
	{
		int tem=q.front();
		q.pop();
		for (int i=0;i<p[tem].size();i++)
		{
			if (!ok[p[tem][i]])
				continue;
			ru[p[tem][i]]--;
			if (ru[p[tem][i]]==0)
			{
				q.push(p[tem][i]);
				ans--;
			}
		}
	}
	if (ans)
	{
		cout<<ans;
	}
	else
	{
		cout<<"YES";
	}
	return 0;
}
2024/1/25 20:12
加载中...