求助!POJ1236
  • 板块题目总版
  • 楼主微分几何
  • 当前回复7
  • 已保存回复7
  • 发布时间2020/10/27 16:47
  • 上次更新2023/11/5 09:44:44
查看原帖
求助!POJ1236
120190
微分几何楼主2020/10/27 16:47

题目地址:https://ac.nowcoder.com/acm/contest/1061/A?&headNav=acm

#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
const int N=1100,M=10000;
int ver[M],Next[M],head[N],dfn[N],low[N];

int vc[M],nc[M],hc[M];
int tc;

int Stack[N],ins[N],c[N];
vector<int> scc[N];
int n,m,tot,num,top,cnt;
void add(int x,int y)
{
	ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
void tarjan(int x)
{
	dfn[x]=low[x]=++num;
	Stack[++top]=x,ins[x]=1;
	for(int i=head[x];i;i=Next[i])
	{
		if(!dfn[ver[i]])
		{
			tarjan(ver[i]);
			low[x]=min(low[x],low[ver[i]]);
		}
		else if(ins[ver[i]])
			low[x]=min(low[x],dfn[ver[i]]);
	}
	if(dfn[x]==low[x])
	{
		cnt++;int y;
		while(x!=y)
		{
			y=Stack[top--],ins[y]=0;
			c[y]=cnt,scc[cnt].push_back(y);
		}
	}
}

void add_c(int x,int y)
{
	vc[++tc]=y,nc[tc]=hc[x],hc[x]=tc;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int y;
		while(cin>>y&&y!=0)
		{
			add(i,y);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		{
			tarjan(i);
		}
	}
	
	int p=0,q=0;
	int v1[n+1],v2[n+1];
	memset(v1,0,sizeof(v1));
	memset(v2,0,sizeof(v2));
	for(int x=1;x<=n;x++)
	{
		for(int i=head[x];i;i=Next[i])
		{
			int y=ver[i];
			if(c[x]==c[y])	continue;
			add_c(c[x],c[y]);
			v1[c[y]]=1;
			v2[c[x]]=1;
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		if(v1[i]==0)	p++;
	}
	for(int i=1;i<=n;i++)
	{
		if(v2[i]==0)	q++;
	}
	cout<<p<<endl;
	cout<<max(p,q)<<endl;
	return 0;
}

只过了27.27%

2020/10/27 16:47
加载中...