P1137 旅行计划

最开始拿到这一道题,感觉是树的结构,但是仔细推了一次样例之后,发现这是个图论,因为样例中的某些节点有子节点,但是和其他父节点连在一起,但是思路应该和树差不多,还是先用vector建图

建完图后,会发现一个城市的答案肯定与连接他的城市有关,这样的话就想到了DP(然后我DP很菜)。对于城市x,显然初始值有 f [ x ] = 1,那么状态转移方程就应该为 f [ x ] = max ( f[x] , dp(a [ x ] [ i ]) ),其中 a [ x ] [ i ] 为连接x的城市。这样这道题的代码就很好写了

#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> a[200005];
int f[200005];
int dp(int x){
	if(f[x]!=-1) return f[x];
	f[x]=1;
	for(register int i=0;i<a[x].size();i++){
		f[x]=max(f[x],dp(a[x][i])+1);
	}
	return f[x];
}
int main(){
	scanf("%d%d",&n,&m);
	fill(f+1,f+1+n,-1);
	for(register int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		a[y].push_back(x);
	}
	for(register int i=1;i<=n;i++){
		printf("%d\n",dp(i));
	}
	return 0;
}
posted @ 2020-06-09 22:06  Poetic_Rain  阅读(92)  评论(0编辑  收藏  举报