dp

11  •  1个月前


主要的dp思想是:对于一条x→y边,所造成的影响是更新了x所能到达的最远的点,那么就从最后一条边开始,依次更新所能到达的最远的点;这里还有一个环的情况,主要使用多次重复这个dp的过程,也就是重复了100遍dp。还有一个预处理环节,按照每一条有向边指向的点的大小进行排序。

#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;
}

评论:

请先登录,才能进行评论