AcWing 164. 可达性统计 拓扑排序+状态压缩
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 164. 可达性统计 拓扑排序+状态压缩相关的知识,希望对你有一定的参考价值。
状态压缩:二进制第几位是1说明这一位可以被达到。
异或操作可以得到所有能达到的1.最后数1即可统计能到的点的数量(count())
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fir(i,a,n) for(int i=a;i<=n;i++)
//======================
const int N=3e4+10;
int n,m;
vector<int>g[N];//存小弟
int deg[N];//数大哥
queue<int>q;
vector<int>ts;
//int sx[N],size[N];
bitset<N>bits[N];
void topsort()
{
fir(i,1,n)
{
if(!deg[i]) q.push(i);
}
while(q.size())
{
int t=q.front();q.pop();
ts.pb(t);
for(int i=0;i<g[t].size();i++)
{
deg[g[t][i]]--;
if(deg[g[t][i]]==0) q.push(g[t][i]);
}
}
}
int main()
{
cin>>n>>m;
fir(i,1,m)
{
int a,b;scanf("%d%d",&a,&b);//a--->b
g[a].pb(b);
deg[b]++;
//sx[i]=a;
}
topsort();
// for(int i=0;i<n;i++) cout<<ts[i]<<" ";
for(int i=ts.size()-1;i>=0;i--)
{
int x=ts[i];
bits[x].reset();//清空
bits[x][x]=1;//有自己
for(int j=0;j<g[x].size();j++)
{
int y=g[x][j];
bits[x]|=bits[y];//和小弟异或 某一位是1代表这一个可以到
}
}
fir(i,1,n)
{
cout<<bits[i].count()<<endl;
}
return 0;
}
以上是关于AcWing 164. 可达性统计 拓扑排序+状态压缩的主要内容,如果未能解决你的问题,请参考以下文章