题意 有一个序列 ,有1,0,2三种点,每个点之间是有向边,如果存在一条路径从1出发中间不要有1并且以2结尾,这些点都是有趣点,否则不是有趣的。
解题报告:我们将1的点bfs ,将2的点反向bfs,那么一个点是有趣点等价于他同时被1,2点所遍历过。
代码:
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int N=100010;
vector<int>v[N][2];
bool vis[N][2];
int n,m;
int d[N];
void bfs(int id,int k)
{
queue<int>q;
for(int i=1;i<=n;i++)
if(d[i]==id)
{
vis[i][k]=1;
q.push(i);
}
while(q.size())
{
int t=q.front();
q.pop();
for(int i=0;i<v[t][k].size();i++)
{
int j=v[t][k][i];
if(!vis[j][k] )
{
if(d[j]!=1)
q.push(j);
vis[j][k]=true;
}
}
}
}
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
cin >> d[i];
while(m--)
{
int a,b;
cin>>a>>b;
v[a][0].push_back(b);
v[b][1].push_back(a);
}
bfs(1,0),bfs(2,1);
for(int i=1;i<=n;i++)
cout<<(vis[i][0]&&vis[i][1])<<' ';
cout<<endl;
return 0;
}