tarjan模板 32/36pts 求调
查看原帖
tarjan模板 32/36pts 求调
342494
wxh666楼主2023/4/12 13:05

评测记录

#include<bits/stdc++.h>
using namespace std;
typedef int lsqxx;
struct lq{
	lsqxx v,nxt;
}e[200005];
lsqxx h[20005],cnt;
void add(lsqxx u,lsqxx v)
{
	e[++cnt].v=v;e[cnt].nxt=h[u];h[u]=cnt;
}
int n,m;
int x,y;
int dfn[10005],low[10005],fn,fdfn[10005];
int vis[10005],dis[10005];
void tarjan(int t)
{
	vis[t]=1;
	dis[t]=1;
	if(!dfn[t])
		dfn[t]=low[t]=++fn,fdfn[dfn[t]]=t;
		
	for(int i=h[t];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(vis[v])
		{
			low[t]=min(low[t],low[v]);
		}
		else
		{
			if(vis[low[v]])
				low[t]=min(low[t],low[v]);
			if(dis[v]) continue;
			tarjan(v);
			if(vis[low[v]])
				low[t]=min(low[t],low[v]);
		}
	}
	vis[t]=0;
}
int ans=0;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		scanf("%d%d",&x,&y),add(x,y);
	for(int i=1;i<=n;i++)
		if(!dis[i])
			tarjan(i);
	for(int i=1;i<=n;i++)
	{
		if(dfn[i]!=low[i]&&vis[fdfn[low[i]]]!=1)
			vis[fdfn[low[i]]]=1,ans++;
	}
	cout<<ans<<endl;
	return 0;
}

上面代码32分

注释一行36分

评测记录

#include<bits/stdc++.h>
using namespace std;
typedef int lsqxx;
struct lq{
	lsqxx v,nxt;
}e[200005];
lsqxx h[20005],cnt;
void add(lsqxx u,lsqxx v)
{
	e[++cnt].v=v;e[cnt].nxt=h[u];h[u]=cnt;
}
int n,m;
int x,y;
int dfn[10005],low[10005],fn,fdfn[10005];
int vis[10005],dis[10005];
void tarjan(int t)
{
	vis[t]=1;
	dis[t]=1;
	if(!dfn[t])
		dfn[t]=low[t]=++fn,fdfn[dfn[t]]=t;
		
	for(int i=h[t];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(vis[v])
		{
			low[t]=min(low[t],low[v]);
		}
		else
		{
			if(vis[low[v]])
				low[t]=min(low[t],low[v]);
//			if(dis[v]) continue;
			tarjan(v);
			if(vis[low[v]])
				low[t]=min(low[t],low[v]);
		}
	}
	vis[t]=0;
}
int ans=0;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		scanf("%d%d",&x,&y),add(x,y);
	for(int i=1;i<=n;i++)
		if(!dis[i])
			tarjan(i);
	for(int i=1;i<=n;i++)
	{
		if(dfn[i]!=low[i]&&vis[fdfn[low[i]]]!=1)
			vis[fdfn[low[i]]]=1,ans++;
	}
	cout<<ans<<endl;
	return 0;
}
2023/4/12 13:05
加载中...