zoukankan      html  css  js  c++  java
  • nyoj 20 吝啬的国度

    吝啬的国度

    时间限制:1000 ms  |  内存限制:65535 KB

    难度:3

    描述

    在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。

    输入

    第一行输入一个整数M表示测试数据共有M(1<=M<=5)组
    每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000),N表示城市的总个数,S表示参观者所在城市的编号
    随后的N-1行,每行有两个正整数a,b(1<=a,b<=N),表示第a号城市和第b号城市之间有一条路连通。

    输出

    每组测试数据输N个正整数,其中,第i个数表示从S走到i号城市,必须要经过的上一个城市的编号。(其中i=S时,请输出-1)

    样例输入

    1

    10 1

    1 9

    1 8

    8 10

    10 3

    8 6

    1 2

    10 4

    9 5

    3 7

    样例输出

    -1 1 10 10 9 8 3 1 1 8

    #include<cstdio>
    #include<cstring>
    #include<vector>
    using namespace std;
    int pre[100005];
    vector<int>v[100005];
    
    void DFS(int cur)
    {
    	for(int i = 0; i < v[cur].size(); ++i)
    	{
    		if(pre[v[cur][i]]) continue; //若存在父节点则继续遍历
    		pre[v[cur][i]] = cur; //相连节点的父节点为cur
    		DFS(v[cur][i]); //深搜到底,把一条路上父节点全部找出
    	}
    }
    
    int main()
    {
    	int ncase, num, cur, i, x, y;
    	scanf("%d", &ncase);
    	while(ncase--)
    	{
    		memset(v, 0, sizeof(v));
    		memset(pre, 0, sizeof(pre));
    		scanf("%d%d", &num, &cur);
    		pre[cur] = - 1; //起点没有父节点
    		for(i = 0; i < num - 1; ++i)
    		{
    			scanf("%d%d", &x, &y);
    			v[x].push_back(y); //x与y相连
    			v[y].push_back(x); //y与x也肯定相连
    		}
    		DFS(cur); //起点开始深搜
    		for(i = 1; i <= num; ++i)
    			printf("%d ", pre[i]); //每个节点的父节点都保存在pri数组,输出即可
    	}
    	return 0;
    }
                    
    

      

  • 相关阅读:
    python 3 day1(上)
    JMeter (一) Thread Group
    TC-001下载并简单使用Python
    SQL Server ->> 谈SQL Server数据库大表迁移
    SQL Server ->> 记Alwayson高可用副本同步失败后续恢复的性能调优争议
    SQL Server ->> AlwaysOn高可用副本同步失败
    SQL Server ->> AlwaysOn 监控脚本
    Linux ->> Source命令
    PSD 转化成 HTML
    笔试
  • 原文地址:https://www.cnblogs.com/zhangliu/p/7052573.html
Copyright © 2011-2022 走看看