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; }