这道题就是拓扑排序,坑点有以下两点: 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;
}