为什么只有48分,不知道哪里有问题,希望大佬帮忙看看
查看原帖
为什么只有48分,不知道哪里有问题,希望大佬帮忙看看
934863
seswsw楼主2024/4/5 15:08
#include<bits/stdc++.h>
using namespace std;
int n,m,cent,h[312122],colortime=1,curtime=1,dout[312122];
int dfn[342122],low[312122],color[311223];
int tong[312122];
stack<int> s;
struct node{
	int vi,nt;
}e[592231];
void add(int x,int y){
	e[cent].vi=y;
	e[cent].nt=h[x];
	h[x]=cent;
	cent++;
}

int tarjan(int x){
	dfn[x]=low[x]=curtime;
	curtime++;
	s.push(x);
	for(int i=h[x];i!=-1;i=e[i].nt){
		int u=e[i].vi;
		if(dfn[u]==0){
			low[x]=min(low[x],tarjan(u));
		}
		else{
			if(color[u]==0){
				low[x]=min(low[x],dfn[u]);
			}
		}
	}
	if(dfn[x]==low[x]){
		while(s.top()!=x){
			int t=s.top();
			s.pop();
			color[x]=colortime;
			tong[colortime]++;
		}
		color[s.top()]=colortime;
		tong[colortime]++;
		s.pop();
		colortime++;
	}
	return low[x];
}

int main(){
	cin>>n>>m;
	for(int i=0;i<=n;i++){
		h[i]=-1;
	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);
	}
	for(int i=1;i<=n;i++){
		if(dfn[i]==0){
			tarjan(i);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=h[i];j!=-1;j=e[j].nt){
			int u=e[j].vi;
			if(color[i]!=color[u]){
				dout[color[i]]++;
			} 
		}
	}
	int ans=0,sum=0;
	for(int i=1;i<colortime;i++){
		if(dout[i]==0){
			ans++;
			sum+=tong[i];
		}
	}
	if(ans==1){
		cout<<sum<<endl;
	}
	else{
		cout<<0<<endl;
	}
}
2024/4/5 15:08
加载中...