RT,没用Tarjan,用的Kosaraju
错的第13个点96什么的就很抑郁
PS:有的数组或变量没有用到,因为直接按缩点模板改的
#include <bits/stdc++.h>
using namespace std;
int n,m,u,v,val,x,siz[100005],res[100005],ans,out[100005],bh[100005],fromp[100005],cnt,zz,vis[100005];
vector<int>road[100005];
bool flag[100005];
vector<int>road2[100005];
vector<int>newp[100005];
map<int,int>isa[100005];
map<int,int>isb;
void dfs_A(int x)
{
if(vis[x]){return;}
vis[x]=1;
for(int i=0;i<road[x].size();i++)
{
dfs_A(road[x][i]);
}
cnt++;
bh[cnt]=x;
}
void dfs_B(int x)
{
if(vis[x]){return;}
vis[x]=1;
// cout<<x<<' '<<cnt<<' ';
newp[cnt].push_back(x);
fromp[x]=cnt;
siz[cnt]++;
for(int i=0;i<road2[x].size();i++)
{
dfs_B(road2[x][i]);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
if(isb[u*1000000+v])
{
continue;
}
isb[u*1000000+v]=1;
road[u].push_back(v);
road2[v].push_back(u);
}
dfs_A(1);
zz=cnt;
cnt=0;
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
cnt++;
flag[i]=1;
siz[cnt]=1;
newp[cnt].push_back(i);
fromp[i]=cnt;
}
}
for(int i=1;i<=n;i++)
{
vis[i]=flag[i];
}
while(zz>0)
{
cnt++;
dfs_B(bh[zz]);
while(zz>0&&vis[bh[zz]])
{
zz--;
}
}
for(int i=1;i<=cnt;i++)
{
for(int j=0;j<newp[i].size();j++)
{
for(int k=0;k<road[newp[i][j]].size();k++)
{
if(fromp[road[newp[i][j]][k]]==i)
{
continue;
}
if(isa[i][fromp[road[newp[i][j]][k]]])
{
continue;
}
out[i]++;
isa[i][fromp[road[newp[i][j]][k]]]=1;
// cout<<"C"<<endl<<i<<' '<<fromp[road[newp[i][j]][k]]<<endl;
}
}
}
int flaged=0;
for(int i=1;i<=cnt;i++)
{
if(out[i]==0)
{
if(flaged){cout<<0<<endl;return 0;}
flaged=i;
}
}
cout<<siz[flaged];
return 0;
}
/*
调试 step(1) 加载中...
对应
1=2
2=14
3=17
4=28
5=38
6=21
7=3
8=26
1->2√
3->17√
2->14√
4->45√
8->71√
5->83√
*/