题意 有一个序列 ,有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; }