URAL - 1651

题目链接:URAL - 1651


因为边有访问顺序,所以我们可以采用动态加边的方式。

也就是按照顺序枚举每一条边,是否会更新下一个点。

但是注意我们要输出方案,所以我们应该是对每个编号存上一个转移点的位置。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e5+10;
int n,dp[N],a[N],pre[N],id[N];
void dfs(int x){
	if(pre[x])	dfs(pre[x]);
	printf("%d ",a[x]);
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	memset(dp,0x3f,sizeof dp);
	dp[a[1]]=0; pre[1]=0; id[a[1]]=1;
	for(int i=2;i<=n;i++){
		if(dp[a[i]]>dp[a[i-1]]+1){
			dp[a[i]]=dp[a[i-1]]+1;
			id[a[i]]=i;
			pre[i]=id[a[i-1]];
		}
	}
	dfs(id[a[n]]);
	return 0;
}
/*
13
1 2 3 4 5 6 7 3 6 11 12 10 7
*/

你可能感兴趣的:(图论,URAL,最短路)