sicily1024 Magic Island(图的遍历)

Description

There are N cities and N-1 roads in Magic-Island. You can go from one city to any other. One road only connects two cities. One day, The king of magic-island want to visit the island from the capital. No road is visited twice. Do you know the longest distance the king can go.

Input

There are several test cases in the input
A test case starts with two numbers N and K. (1<=N<=10000, 1<=K<=N). The cities is denoted from 1 to N. K is the capital.

The next N-1 lines each contain three numbers XYD, meaning that there is a road between city-X and city-Y and the distance of the road is D. D is a positive integer which is not bigger than 1000.
Input will be ended by the end of file.

Output

One number per line for each test case, the longest distance the king can go.

Sample Input

3 1
1 2 10
1 3 20

Sample Output

20

城市i对应的连接的路存到vector类型的cities[i]中;

每一条路有对应的id;

用visited[id]来记录是否已经走过这条路;

以下是代码:

#include <iostream>
#include <vector>
using namespace std;

struct road{
    int id;            // every road has a unique id
    int end;        // connect to which city
    int length;        // the length of this road
    road(int i, int e, int l) {
        id = i, end = e, length = l;
    }
};

#define MAX 10001
bool visited[MAX];    // when the road i is visited, visited[i] = true
vector<road> cities[MAX];    // cities[i] stores all roads connecting the city i
int maxLength;

void dfs(int k, int total = 0) {
    for (int i = 0; i < cities[k].size(); i++) {
        // when the road has not visited
        if (!visited[cities[k][i].id]) {
            // visit the road
            visited[cities[k][i].id] = true;
            total += cities[k][i].length;
            if (total > maxLength) maxLength = total;
            // visit all roads connecting the city ‘cities[k][i].end‘
            dfs(cities[k][i].end, total);
            // unvisit the road
            visited[cities[k][i].id] = false;
            total -= cities[k][i].length;
        }
    }
}

int main() {
    int n, k;
    while (cin>>n>>k) {
        for (int i = 1; i <= n; i++) {    // initial
            visited[i] = false;
            cities[i].clear();
        }
        for (int i = 1; i < n; i++) {
            int x, y, l;
            cin>>x>>y>>l;
            cities[x].push_back(road(i, y, l));
            cities[y].push_back(road(i, x, l));
        }
        maxLength = 0;
        dfs(k);
        cout<<maxLength<<endl;
    }
    return 0;
}
时间: 2024-12-11 17:45:42

sicily1024 Magic Island(图的遍历)的相关文章

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先 本篇名言:"生活真象这杯浓酒 ,不经三番五次的提炼呵 , 就不会这样一来可口 ! -- 郭小川" 继续看下广度优先的遍历,上篇我们看了深度遍历是每次一个节点的链表是走到底的. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47029275 1.  原理 首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的

算法导论--图的遍历(DFS与BFS)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51897538 图的遍历就是从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次.为了保证图中的顶点在遍历过程中仅访问一次,要为每一个顶点设置一个访问标志.通常有两种方法:深度优先搜索(DFS)和广度优先搜索(BFS).这两种算法对有向图与无向图均适用. 以下面无向图为例: 1.深度优先搜索(DFS) 基本步骤: 1.从图中某个顶点v0出发,首先访问v

图的遍历总结

概念 图的遍历有两种遍历方式:深度优先遍历(depth-first search)和广度优先遍历(breadth-first search). 1.深度优先遍历 基本思路:首先从图中某个顶点V0出发,然后依次从V0相邻的顶点出发深度优先遍历,直至图中所有与V0路径相通的顶点都被访问了:若此时尚有顶点未被访问,则从中选一个顶点作为起始点,重复上述过程,直到所有的顶点都被访问.可以看出深度优先遍历是一个递归的过程. 如下图中的一个无向图: 其深度优先遍历得到的序列为: 0->1->3->7-

41 蛤蟆的数据结构笔记之四十一图的遍历之深度优先

41  蛤蟆的数据结构笔记之四十一图的遍历之深度优先 本篇名言:"对于我来说 , 生命的意义在于设身处地替人着想 , 忧他人之忧 , 乐他人之乐. -- 爱因斯坦" 上篇我们实现了图的邻接多重表表示图,以及深度遍历和广度遍历的代码,这次我们先来看下图的深度遍历. 欢迎转载,转载请标明出处: 1.  原理 图遍历又称图的遍历,属于数据结构中的内容.指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它

java实现图的遍历(深度优先遍历和广度优先遍历)

package arithmetic.graphTraveral;import java.util.LinkedList;import java.util.Queue; /** * 这个例子是图的遍历的两种方式 * 通过它,使我来理解图的遍历 * Created on 2013-11-18 * @version 0.1 */public class GraphTraveral{ // 邻接矩阵存储图 // --A B C D E F G H I // A 0 1 0 0 0 1 1 0 0 //

数据结构快速回顾——图的遍历

图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上. 图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法. 深度优先搜索法DFS 深度优先搜索法的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续.如果当前被访问过的顶点的所有邻接顶点都已

图的遍历(深度优先与广度优先搜索两种方案)

1.图的遍历--深度优先搜索 import java.util.Scanner ; public class Map{ static int n ; static int m ; static int[] book ; static int[][] e ; public static void mapDfs(int cur){ //深度优先搜索思想核心: System.out.print(cur + " ") ; for (int i=1;i<=n;i++) { if (e[cu

图的遍历

1.遍历 图的遍历与树的很相似,遍历满足:(1).对每一个顶点都得进行一次访问:(2).对其不能进行重复的访问,只能是一次:  对上次的一个补充: 当父类是模板类时,子类继承后,要是想调用父类的方法/数据,必须加上模板的作用域限定符:例 : Grapth<Type>::maxVertices;方可在子类中使用父类的数据或方法: 2.深度优先(DFS) DFS(depth first search)是:一个不断探查和回溯的过程,一个往死里整的过程:一条路必须走到死方可结束: 模型分析: 3.广度

图的遍历 - 数据结构

图的遍历 - 数据结构 概述 图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的其它算法如求解图的连通性问题,拓扑排序,求关键路径等都是建立在遍历算法的基础之上. 由于图结构本身的复杂性,所以图的遍历操作也较复杂,主要表现在以下四个方面:① 在图结构中,没有一个“自然”的首结点,图中任意一个顶点都可作为第一个被访问的结点.② 在非连通图中,从一个顶点出发,只能够访问它所在的连通分量上的所有顶点,因此,还需考