反向dfs法

11  •  1个月前


主要的思路就是从最后一个点开始,看看这个点所能到达的前面的所有的点。把本来应该x→y的边改为y→x,也就是由一个点所能到达的最远的点改为一个点所能到达的所有的点,好处是之前的算法时间复杂度是O(N*M)的;而由一个点所能到的其他的点的时候,只要这个点已经被找到了,就不需要再进行判断了,时间复杂度就降为了O(N+M)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,dp[100001];
struct aaa{
	int x;int y;
}a[100001];
int cmp(aaa n1,aaa n2)
{
	return n1.y>n2.y;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<=n;i++)
		dp[i]=i;
	for(int i=0;i<m;i++)
		scanf("%d%d",&a[i].x,&a[i].y);
	sort(a,a+m,cmp);
	for(int t=0;t<100;t++)
		for(int j=0;j<m;j++)
			dp[a[j].x]=max(dp[a[j].x],dp[a[j].y]);
	for(int i=1;i<=n;i++)
		printf("%d ",dp[i]);
	return 0;
}

评论:

请先登录,才能进行评论