zoukankan      html  css  js  c++  java
  • hihoCoder 1041 国庆出游 (DFS)

    题意: 小Hi和小Ho准备国庆期间去A国旅游。A国的城际交通比较有特色:它共有n座城市(编号1-n);城市之间恰好有n-1条公路相连,形成一个树形公路网。小Hi计划从A国首都(1号城市)出发,自驾遍历所有城市,并且经过每一条公路恰好两次——来回各一次——这样公路两旁的景色都不会错过。

    令小Hi苦恼的是他的小伙伴小Ho希望能以某种特定的顺序游历其中m个城市。例如按3-2-5的顺序游历这3座城市。(具体来讲是要求:第一次到达3号城市比第一次到达2号城市早,并且第一次到达2号城市比第一次到达5号城市早)。

    小Hi想知道是否有一种自驾顺序满足小Ho的要求。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include<set> 
    using namespace std;
    #define INF 0x7fffffff
    
    set<int>child[110];
    vector<int>adj[110];
    int pre[110];
    int n,m,s[110],vis[110]; 
    
    void init(){
    	int i;
    	for(i=1;i<110;i++){
    		child[i].clear();
    		adj[i].clear();
    		pre[i] = 0;
    		vis[i] = 0;
    	}
    }
    
    void dfs1(int x){
    	int i,j;
    	int d = adj[x].size();
    	for(i=0;i<d;i++){
    		int t = adj[x][i];
    		if(!vis[t]){
    			vis[t] = 1;
    			pre[t] = x;
    			int k = t;
    			while(pre[k] > 0){
    				child[pre[k]].insert(t);
    				k = pre[k];
    			}
    			dfs1(t);
    		}
    	}
    }
    
    bool dfs2(int x,int p){
    	int i,t,d = adj[x].size();
    	if(p == x)
    	     return true;
    	for(i=0;i<d;i++){
    		int k = adj[x][i];
    		if(!vis[k] ){
    			vis[k] = 1;
    			if(!dfs2(k,p))
    			    vis[k] = 0;
    			else
    			    return true;
    			
    		}
    	}
    	return false;
    }
    
    int main(){
    	int i,j,n,T,a,b,now,cnt;
    	cin >> T;
    	while(T--){
    		init();
    		scanf("%d",&n);
    		for(i=1;i<n;i++){
    			scanf("%d%d",&a,&b);
    			adj[a].push_back(b);
    			adj[b].push_back(a);
    		}
    		
    		scanf("%d",&m);
    		for(i=1;i<=m;i++)
    		    scanf("%d",&s[i]);
    		vis[1] = 1;
    		dfs1(1);
    		
    		int ans = 1;
    		if(s[1] == 1)
    			cnt = 2;
    		else
    			cnt = 1;
    		now = 1;
    		memset(vis,0,sizeof(vis));
    		vis[1] = 1;
    		for( ; cnt <= m ; ){
    			if(child[now].find(s[cnt])!=child[now].end()){
    				if(!dfs2(now,s[cnt])){
    					ans = 0;
    					break;
    				}	
    				now = s[cnt++];		
    			}
    			else{
    				while(now && child[now].find(s[cnt]) == child[now].end()){
    					now = pre[now];
    				}
    				if(!now){
    					ans = false;
    					break;
    				}
    			}
    		}
    		if(ans)
    		    printf("YES
    ");
    		else
    		    printf("NO
    ");
    	} 
    	return 0;
    }
    
  • 相关阅读:
    数据结构之查找算法总结笔记
    html的a链接的href怎样才另起一个页面
    深入理解CSS中的空白符和换行
    CSS文本方向
    alert()与console.log()的区别
    CSS旧版flex及兼容
    Java:类与继承
    Java中只有按值传递,没有按引用传递!
    String作为方法参数传递 与 引用传递
    Java:按值传递还是按引用传递详细解说
  • 原文地址:https://www.cnblogs.com/jxgapyw/p/4808532.html
Copyright © 2011-2022 走看看