/*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;
}
05-23
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交