76pts,WA on #2,5,6,10,11,12 求调
查看原帖
76pts,WA on #2,5,6,10,11,12 求调
961827
Tang_poetry_syndrome楼主2023/11/28 13:48

rt,代码如下,拍了8000组没拍出来(捂脸)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define f(i,j,k) for(int i=j;i<=k;++i)
#define g(i,j,k) for(int i=j;i>=k;--i)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
const int N=1e5+10,mod=1e9+7;
void gtmin(int a,int &b){if(b>a)b=a;}
int dfn[N],low[N],dfncnt,scc[N],sc,sz[N],cd[N];//深搜节点被搜索次序,在u子树中能回溯到的最早的栈中节点 
stack<int>s;
vector<int>g[N];
bool flag[N];//记录是否在栈中 
void tarjan(int u)
{
	low[u]=dfn[u]=++dfncnt;
	s.push(u),flag[u]=1;
	for(auto v:g[u])
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(flag[v])low[u]=min(low[u],dfn[v]);
	if(dfn[u]==low[u])
	{
		/*sc++;//强连通分量+1
		while(!s.empty())
		{
			scc[s.top()]=sc;
			flag[s.top()]=0;
			sz[sc]++;
			s.pop();
		}*/
		scc[u]=++sc;
        ++sz[sc];
        while(!s.empty()&&s.top()!=u)
        {
            ++sz[sc];
            scc[s.top()]=sc;
            s.pop();
        }
        if(!s.empty())s.pop();
	}
	return ;
}
int n,m;
void debug()
{
	cout<<"Debug:\n";
	f(i,1,n)
		cout<<scc[i]<<' '<<sz[i]<<'\n';
	cout<<'\n';
	return;
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	f(i,1,m)
	{
		int x,y;
		cin>>x>>y;
		g[y].pb(x);
	}
	f(i,1,n)if(!dfn[i])tarjan(i);
	f(u,1,n)for(auto v:g[u])if(scc[v]!=scc[u])cd[scc[v]]++;
	int ansi=0;
	f(i,1,sc)
		if(!cd[i]){
			if(ansi){cout<<0;return 0;}
			ansi=i;
		}
	//debug();
	cout<<sz[ansi];
	return 0;
}
2023/11/28 13:48
加载中...