Tarjan 36pts,样例已过,求助
查看原帖
Tarjan 36pts,样例已过,求助
592238
Elairin176楼主2023/2/5 15:43
//Code by __dest__ruct__or__(uid=592238)
#include <iostream>
#include <cstring>
using namespace std;
#define umap unordered_map
#define uset unordered_set
#define ll long long
#define ld long double
#define pii pair<int,int>
#define pll pair<long long,long long>
const ll INF=9223372036854775807;
namespace mySTL{
	inline int max(int a,int b){return a>b?a:b;}
	inline int min(int a,int b){return a<b?a:b;}
	inline ll max(ll a,ll b){return a>b?a:b;}
	inline ll min(ll a,ll b){return a<b?a:b;}
	inline ld min(ld a,ld b){return a<b?a:b;}
	inline ld max(ld a,ld b){return a>b?a:b;}
	inline int _abs(int a){return a<0?-a:a;}
	inline int read(){char c=getchar();int f=1,ans=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
	return ans*f;}
	inline long long readll(){char c=getchar();long long f=1,ans=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
	return ans*f;}
	inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
	inline void swap(ll &a,ll &b){a^=b,b^=a,a^=b;}
	inline void write(int x){if(x<0){putchar('-');x=-x;}
	if(x>=10){write(x/10);}putchar(x%10+'0');}
	inline void writell(long long x){if(x<0){putchar('-');x=-x;}
	if(x>=10){writell(x/10);}putchar(x%10+'0');}
	inline ll pw(ll a,ll b,ll p){if(b==0)return 1;
	if(b==1)return a%p;
	ll mid=pw(a,b/2,p)%p;
	if(b&1)return mid*mid%p*a%p;else{return mid*mid%p;}}
	inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
	inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
	inline int lcm(int a,int b){return a*b/gcd(a,b);}
}
using namespace mySTL;
struct edge{
	int u;
	int nxt;
}a[50500];
int n,m,u,v,last[10010],tot,id,dfn[10010],low[10010],cnt,sum[10010];
int stk[10010],hd,belong[10010],ans;
bool instk[10010];
inline void add(int u,int v){
	a[++tot].u=v;
	a[tot].nxt=last[u];
	last[u]=tot;
}
inline void Tarjan(int x){
	dfn[x]=++id;
	low[x]=id;
	stk[++hd]=x;
	instk[x]=true;
	for(int i=last[x];i!=-1;i=a[i].nxt){
		int v=a[i].u;
		if(!dfn[v]){
			Tarjan(v);
			low[x]=min(low[x],low[v]);
		}else if(instk[v]){
			low[x]=min(low[x],low[v]);
		}
	}
	if(dfn[x]==low[x]){
		cnt++;
		while(stk[hd+1]!=x){
			sum[cnt]++;
			instk[stk[hd]]=false;
			belong[stk[hd]]=cnt;
			hd--;
		}
	}
}
int main(void){
	//freopen("data.txt","r",stdin);
	memset(last,-1,sizeof(last));
	n=read();
	m=read();
	while(m--){
		u=read();
		v=read();
		add(u,v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			Tarjan(i);
		}
	}
	for(int i=1;i<=cnt;i++){
		if(sum[i]==n-1){
			ans++;
		}
	}
	write(ans);
	return 0;
}
2023/2/5 15:43
加载中...