WA#10求助
查看原帖
WA#10求助
57273
Reywmp楼主2020/10/26 14:26
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stack>
using namespace std;
int n;
stack <int> s;
struct Rey
{
	int nxt,to;
}e[20005];
int head[105],cnt;
int dfn[105],low[105],tot,secs,sec[105];
bool in[105];
int ipt[105],opt[105],ego[105],egi[105],edges;

void add(int u,int v)
{
	e[++cnt].nxt=head[u];
	e[cnt].to=v;
	head[u]=cnt;
}

void Tarjan(int x)
{
	dfn[x]=low[x]=++tot;
	s.push(x);in[x]=1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int go=e[i].to;
		if(!dfn[go]){Tarjan(go);low[x]=min(low[x],low[go]);}
		else if(in[go])low[x]=min(low[x],dfn[go]);
	}
	if(low[x]==dfn[x])
	{
		secs++;int tp;
		do
		{
			tp=s.top();
			s.pop();
			sec[tp]=secs;
			in[tp]=0;
		}while(tp!=x);
	}
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;
		do
		{
			scanf("%d",&x);
			if(x)
			{
				add(i,x);
				++edges;
				ego[edges]=i;
				egi[edges]=x;
			}
		}while(x);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])Tarjan(i);
	}
	int ans1,ans2;
	ans1=ans2=0;
	for(int i=1;i<=edges;i++)
	{
		if(sec[ego[i]]!=sec[egi[i]])
		{
			ipt[sec[egi[i]]]++;
			opt[sec[ego[i]]]++;
		}
	}
	for(int i=1;i<=secs;i++)
	{
		if(ipt[i]==0)ans1++;
		if(opt[i]==0)ans2++;
	}
	ans2=max(ans2,ans1);
	if(secs==1)puts("1\n0");
	else
	printf("%d\n%d\n",ans1,ans2);
	return 0;
}

100分程序:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stack>
using namespace std;
int n;
stack <int> s;
struct Rey
{
	int nxt,to;
}e[20005];
int head[105],cnt;
int dfn[105],low[105],tot,secs,sec[105];
bool in[105];
int ipt[105],opt[105],ego[105],egi[105],edges;

void add(int u,int v)
{
	e[++cnt].nxt=head[u];
	e[cnt].to=v;
	head[u]=cnt;
}

void Tarjan(int x)
{
	dfn[x]=low[x]=++tot;
	s.push(x);in[x]=1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int go=e[i].to;
		if(!dfn[go]){Tarjan(go);low[x]=min(low[x],low[go]);}
		else if(in[go])low[x]=min(low[x],dfn[go]);
	}
	if(low[x]==dfn[x])
	{
		secs++;int tp;
		do
		{
			tp=s.top();
			s.pop();
			sec[tp]=secs;
			in[tp]=0;
		}while(tp!=x);
	}
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;
		do
		{
			scanf("%d",&x);
			if(x)
			{
				add(i,x);
				//++edges;
				//ego[edges]=i;
				//egi[edges]=x;
			}
		}while(x);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])Tarjan(i);
	}
	int ans1,ans2;
	ans1=ans2=0;
	/*for(int i=1;i<=edges;i++)
	{
		if(sec[ego[i]]!=sec[egi[i]])
		{
			ipt[sec[egi[i]]]++;
			opt[sec[ego[i]]]++;
		}
	}*/
	for(int i=1;i<=n;i++)
	{
		for(int j=head[i];j;j=e[j].nxt)
		{
			int go=e[j].to;
			if(sec[go]!=sec[i])
			{
				ipt[sec[go]]++;
				opt[sec[i]]++;
			}
		}
	}
	for(int i=1;i<=secs;i++)
	{
		if(ipt[i]==0)ans1++;
		if(opt[i]==0)ans2++;
	}
	ans2=max(ans2,ans1);
	if(secs==1)puts("1\n0");
	else
	printf("%d\n%d\n",ans1,ans2);
	return 0;
}

为什么记录下输入时的每条边进行缩点和用前向星遍历缩点分数就不一样呢?

感谢。

2020/10/26 14:26
加载中...