sicily 1024. Magic Island(week 11)

来源:互联网 发布:帝国cms仿bt天堂源码 编辑:程序博客网 时间:2024/06/05 02:16

题目链接:http://soj.sysu.edu.cn/1024
这里要注意到,有n个点,但是只有n-1条路径,说明是树,用dfs求树的最长路径:
(用c++输入0.35s,用c输入0.18s)

#include <iostream>  #include <vector>  #include <string.h>  #include <cstring>  #include <stdio.h>  using namespace std;  struct Road {      int to, distance;//目的地和距离      Road(int new_to, int new_distance) {//这样写为了读入方便          to = new_to;          distance = new_distance;      }  };  vector<Road> roads[10001];//注意这里是二维动态数组  bool vis[10001];  int longest_road, n;  void dfs(int from, int dis) {      if (dis > longest_road)//更新最长的路径          longest_road = dis;      vis[from] = true;//这个点已经访问过,不重复访问      for (int i = 0; i < (int)roads[from].size(); i++) {//遍历from所能连通的点并判断是否dfs          if (!vis[roads[from][i].to]) {              dfs(roads[from][i].to, dis + roads[from][i].distance);          }      }  }  int main() {      int k, i, temp_from, temp_to, new_distance;      while (cin >> n >> k) {          longest_road = 0;          memset(vis, false, sizeof(vis));          memset(roads, 0, sizeof(roads));          for (i = 0; i < n - 1; i++) {              scanf("%d%d%d", &temp_from, &temp_to, &new_distance);              roads[temp_from].push_back(Road(temp_to, new_distance));//注意这里两点是互通的              roads[temp_to].push_back(Road(temp_from, new_distance));          }          dfs(k, 0);          printf("%d\n", longest_road);      }      return 0;  }  
0 0