zoukankan      html  css  js  c++  java
  • 大臣的旅费

    转载请注明出处:http://www.cnblogs.com/zhishoumuguinian/p/8453272.html

    思路:从任意一点a开始找到最长路径的终点为b, 在从b开始找最长路径的终点为d。 b, d之间的路径就是图中最长路径。证明略。粘上代码。

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 struct Road
     5 {
     6     int d, L;
     7 };
     8 vector< vector<Road> >G(11000);
     9 int maxLen = 0;
    10 int totalLen = 0;
    11 int N, num;
    12 int  midl;
    13 int visited[11000]= {0};
    14 void dfs(int s)
    15 {
    16     if(num > N) return;
    17     for(int i=0; i<G[s].size(); i++)
    18     {
    19         Road r = G[s][i];
    20         if(!visited[r.d])
    21         {
    22             totalLen += r.L;
    23             num++;
    24             visited[r.d]=1;
    25             if(totalLen > maxLen)
    26             {
    27                 maxLen = totalLen;
    28                 midl = r.d;
    29             }
    30             dfs(r.d);
    31             totalLen -= r.L;
    32         }
    33     }
    34 }
    35 
    36 int main()
    37 {
    38     cin>> N;
    39     for(int i=0; i<N-1; i++)//读入数据
    40     {
    41         Road r;
    42         int s;
    43         cin>>s >> r.d >> r.L;
    44         G[s].push_back(r);
    45         Road t;
    46         t.d=s;
    47         t.L=r.L;
    48         G[r.d].push_back(t);
    49     }
    50     num=1;
    51     visited[1]=1;
    52     dfs(1);//任意一点开始dfs
    53     totalLen=0;
    54     maxLen=0;
    55     num=1;
    56     
    57     memset(visited, 0, sizeof(visited));//为重新dfs准备
    58     visited[midl]=1;
    59     dfs(midl);//上一最长路径终点开始dfs
    60     int a=11;
    61     int b=maxLen+10;
    62     int sum=(a+b)*maxLen/2;
    63     cout<< sum;
    64 }

     

  • 相关阅读:
    c-指针
    iOS 多线程
    iOS 必备技术点
    网络请求
    objective-c基础教程——学习小结
    id类型
    排序算法
    iOS网络
    iOS 绘图
    Python——字符串2.0(实验)(python programming)
  • 原文地址:https://www.cnblogs.com/zhishoumuguinian/p/8453272.html
Copyright © 2011-2022 走看看