真心建议修改数据,太水了
查看原帖
真心建议修改数据,太水了
912779
isme1楼主2024/7/23 22:31
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,h,ans,mp[2000010],q[2000010],top,dfsn[2000010],low[2000010],vis[2000010],k,cnt;
vector<int>g[20010];
void dfs(int u){
	q[++top]=u;
	dfsn[u]=++k;
	low[u]=k;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		if(!dfsn[v]){
			dfs(v);
			low[u]=min(low[u],low[v]);
		}
		else if(!vis[u]){//注意这里,本来应该是v的,我写成u也能过
			low[u]=min(low[u],dfsn[v]);
		}
	}
	if(low[u]==dfsn[u]){
		cnt++;
		int l=0;
		while(1){
			int v=q[top];
			top--;
			vis[v]=cnt;
			if(u==v){
				break;
			}
			l++;
		}
		if(l==0){
			h++;
		}
	}
} 
void tarjan(int n){
	for(int i=1;i<=n;i++){
		if(!dfsn[i]){
			dfs(i);
		}
	}
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++){
    	int u,v;
    	cin>>u>>v;
    	g[u].push_back(v);
	}
	tarjan(n);
	for(int i=1;i<=n;i++){
		ans+=(mp[vis[i]]==0);
		mp[vis[i]]=1;
	}
	cout<<ans-h;
	return 0;
}

2024/7/23 22:31
加载中...