反向建边,vis记录每条边起点是否在途中,起点从0开始搜索,若按a的路径能走通则走a,反之走b

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
vector<int>edge[100001];
bool vis[100001];
int a[100001],b[100001];
char ans[100001];
bool f;
int n;
void dfs(int x){
	if (vis[x])  
	   return ;
	vis[x]=true;
	for (int i=0;i<edge[x].size();i++)
	   dfs(edge[x][i]);
	return; 
}


void dfs2(int x,int step){
	if (x<0||x>=n||!vis[x])
	 return;
	 if (step>=n)
	   return;
    if (x==n-1)
      {
      	f=true;
      	return;
	  }
	  if (x+a[x]>=0&&x+a[x]<n&&vis[x+a[x]])
	    {
	    	ans[step]='a';
	    	dfs2(x+a[x],step+1);
		}
       else {
       	ans[step]='b';
       	dfs2(x+b[x],step+1);
	   }
  return;
} 

int main(){
  scanf("%d",&n);
  for (int i=0;i<n;i++)
     scanf("%d",&a[i]);
	   
  for (int i=0;i<n;i++)
     scanf("%d",&b[i]);
	
   for(int i=0;i<n;i++)
    if(i+a[i]>=0&&i+a[i]<n)
	    edge[i+a[i]].push_back(i); 
  
    for(int i=0;i<n;i++)
    if (i+b[i]>=0&&i+b[i]<n)
        edge[i+b[i]].push_back(i);
        
    dfs(n-1);
    if (!vis[0])
      printf("No solution!\n");
    else {
    	dfs2(0,0);
        if(f)
		 printf("%s\n",ans);
		else printf("Infinity!\n"); 
	}
  return 0;
}