92分 #3#13 WA这个两个测试点为什么出零??求解
查看原帖
92分 #3#13 WA这个两个测试点为什么出零??求解
275192
a_yong楼主2023/2/3 14:33
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define N 50010
struct edge{
	int from;
	int to;
}e[N];
int dfn[N]={},low[N];
vector<int>ed[N];
int lt[N]={};
int gs[N]={};
int rd[N]={};
int n,m,num=1;
stack<int> s;
void getdfn(int a){
	low[a]=dfn[a];	
	s.push(a);
	for(int i=0;i<ed[a].size();i++){

		if(dfn[ed[a][i]]==0) {
			num++;
			dfn[ed[a][i]]=num;
			getdfn(ed[a][i]);	
		}
		low[a]=min(low[a],low[ed[a][i]]);
	//	printf("a=%d he %d\n",a,ed[a][i]);
	}
	return;
}
int main()
{
	scanf("%d%d",&n,&m);
	int tmp1,tmp2;
	for(int i=1;i<=m;i++){
		scanf("%d",&tmp1);
		scanf("%d",&tmp2);
		ed[tmp1].push_back(tmp2);
		e[i].from=tmp1;e[i].to=tmp2;
	}
	dfn[1]=1;	
	getdfn(1);
	num=1;
	while(!s.empty()){
		int tt=s.top();
		lt[num]++;
		gs[tt]=num; 
		if(low[tt]==dfn[tt])
			num++; 
		s.pop(); 
	}
	if(lt[num]==0)
		num--;
	for(int i=1;i<=m;i++){
		if(gs[e[i].from]!=gs[e[i].to]) rd[gs[e[i].from]]++;
	}
	int ans=0,f=0;
	for(int i=1;i<=num;i++){
		if(rd[i]==0) {
			ans=lt[i];
			f++;
		}
	
	}
	if(n!=1&&m==0) printf("0\n"); 
	else if(f==1)printf("%d\n",ans);
	else printf("0\n");
	return 0;
}
2023/2/3 14:33
加载中...