【DFS】Gym - 101142C - CodeCoder vs TopForces

本文介绍了一种基于有向图的DFS遍历算法实现方法。通过建立含有2n-2条边的有向图,并对顶点进行评分排序,从评分最高的顶点开始深度优先搜索,使用vis数组避免重复访问,确保每个顶点仅被访问一次。

就按照题意建出有向图来(n个点,2n-2条边),然后从按随便一个rating排序,从最后一个开始dfs,用vis数组防止重复访问,因为每次之前的肯定能访问之后的(及之后的能访问的),所以不会有重复。就行了。

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100010
int a[N],b[N],A[N],n,B[N],sum;
bool cmp(const int &a,const int &b)
{
	return A[a]>A[b];
}
bool cm2(const int &a,const int &b)
{
	return B[a]>B[b];
}
int e,v[N<<1],next[N<<1],first[N];
void AddEdge(int U,int V)
{
	v[++e]=V;
	next[e]=first[U];
	first[U]=e;
}
bool vis[N];
void dfs(int U)
{
	++sum;
	vis[U]=1;
	for(int i=first[U];i;i=next[i])
	  if(!vis[v[i]])
	    dfs(v[i]);
}
int anss[N];
int main()
{
	freopen("codecoder.in","r",stdin);
	freopen("codecoder.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	  scanf("%d%d",&A[i],&B[i]);
	for(int i=1;i<=n;++i)
	  a[i]=b[i]=i;
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n+1,cm2);
	for(int i=1;i<n;++i)
	  AddEdge(a[i],a[i+1]);
	for(int i=1;i<n;++i)
	  AddEdge(b[i],b[i+1]);
	for(int i=n;i>=1;--i)
	  {
	  	if(!vis[a[i]])
	  	  dfs(a[i]);
	  	anss[a[i]]=sum-1;
	  }
	for(int i=1;i<=n;++i)
	  printf("%d\n",anss[i]);
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/6352137.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值