数据水了?
查看原帖
数据水了?
676569
WoodReal12楼主2024/6/16 13:40

正常的AC代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N=10005;
vector<int> e[N];
int dfn[N],low[N],tot=0;
int stk[N],instk[N],top=0;
int scc[N],sz[N],cnt=0;
void tarjan(int x){
	dfn[x]=low[x]=++tot;
	stk[++top]=x,instk[x]=1;
	for(int y:e[x]){
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(instk[y])
			low[x]=min(low[x],dfn[y]);
	}
	if(dfn[x]==low[x]){
		int y;
		cnt++;
		do{
			y=stk[top--],instk[y]=0;
			scc[y]=cnt;
			++sz[cnt];
		}while(x!=y);
	}
}
int n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
	}
	for(int i=1;i<=n;i++)
	    if(!dfn[i])
		    tarjan(i);
	int ans=0;
	for(int i=1;i<=cnt;i++){
		if(sz[i]>1)
			ans++;
	}
	cout<<ans<<endl;
    return 0;
}

但当我把

for(int i=1;i<=n;i++)
	    if(!dfn[i])
		    tarjan(i);

中的if(!dfn[i])注释掉以后,照样可以AC,但在其他题目中却无法AC。

2024/6/16 13:40
加载中...