Sicily 1024. Magic Island (DFS 深度优先搜索)

来源:互联网 发布:淘宝联盟 淘客助手 编辑:程序博客网 时间:2024/05/22 15:31
/*sicily 1024. Magic Island  (DFS 深度优先搜索) 题目大意:给出N个城市(编号为1-N-1),城市之间共有N-1条道路连通两个城市。          指定一个K城市出发,求出可以到达的城市的最大距离 解题思路:以道路连线Line为基础单位,建立起始节点的容器vector数组line。          即每个line元素为一个vector,每个vector的从该城市出发的各条边          例如                 1           2           3               (1,2,10)    (2,1,10)    (3,1,20)               (1,3,20)                          如果从1开始出发,则先获得(1,2,10).然后跑到2那里遍历这个vector,此时          maxDistance=10           遍历(2,1,10),而发现1已经被访问过,结束2的访问。回到1. 到下一个         (1,3,20),此时maxDistance=20. 而在3的(3,1,20)处发现1已经被访问过。         结束回到1. 此时1的vector已经访问完毕,停止。                                                                                           */#include <stdio.h>#include <stdlib.h>#include <vector>#include <memory.h>using namespace std;struct Line {   int start;   int end;   int distance;   Line(int _start, int _end, int _distance){      start = _start;      end   = _end;      distance = _distance;          }};int maxDistance;vector<Line> line[20000];bool visit[20000];void dfs(int index, int distance){   if(distance > maxDistance)     maxDistance = distance;   visit[index] = 1;   for(int i=0; i<line[index].size(); i++){      int tempDistance = line[index][i].distance;      int tempEnd = line[index][i].end;      if(!visit[tempEnd])        dfs(tempEnd, distance+tempDistance);           }   visit[index] = 0;}int main (){    int N, K;    int start,end,distance;    while(scanf("%d %d",&N,&K) != EOF)    {       memset(line,0,sizeof(line));       memset(visit,0,sizeof(visit));       maxDistance = 0;       for(int i=1; i<=N-1; i++){               scanf("%d %d %d", &start, &end, &distance);          line[start].push_back(Line(start,end,distance));          line[end].push_back(Line(end,start,distance));       }             dfs(K, 0);      printf("%d\n", maxDistance);                            }    system("pause");    return 0;    }

原创粉丝点击