POJ 2631 Roads in the North 【樹的直徑】

Roads in the North
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 2919   Accepted: 1432

Description

Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route from a village to a village that does not pass through some other village twice. 
Given is an area in the far North comprising a number of villages and roads among them such that any village can be reached by road from any other village. Your job is to find the road distance between the two most remote villages in the area. 

The area has up to 10,000 villages connected by road segments. The villages are numbered from 1. 

Input

Input to the problem is a sequence of lines, each containing three positive integers: the number of a village, the number of a different village, and the length of the road segment connecting the villages in kilometers. All road segments are two-way.

Output

You are to output a single integer: the road distance between the two most remote villages in the area.

Sample Input

5 1 6
1 4 5
6 3 9
2 6 8
6 1 7

Sample Output

22

Source


原題鏈接:http://poj.org/problem?id=2631

題意:輸入是一系列行,每行包含三個正整數:一個村的數量,一個不同的村莊的數量,以及連接村莊的路段長度,以公里爲單位。 所有路段都是雙向的。
您要輸出一個整數:該地區最偏遠的兩個村莊之間的道路距離。

現在可以直接裸樹的直徑的模板了。

AC代碼:

/**
  * 行有餘力,則來刷題!
  * 博客鏈接:http://blog.csdn.net/hurmishine
  * 個人博客網站:http://wuyunfeng.cn/
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;
const int maxn=10000+4;
vector<pair<int,int> >G[maxn];
int dis[2][maxn];
bool vis[maxn];
int d;
int p;

void DFS(int u,int flag)
{
    vis[u]=true;
    if(dis[flag][u]>d)
    {
        d=dis[flag][u];
        p=u;
    }
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i].first;
        int w=G[u][i].second;
        if(!vis[v])
        {
            dis[flag][v]=dis[flag][u]+w;
            DFS(v,flag);
        }
    }
}

int main()
{
    //freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);
    int u,v,w;
    while(cin>>u>>v>>w)
    {
        G[u].push_back(make_pair(v,w));
        G[v].push_back(make_pair(u,w));
    }
    memset(dis,0,sizeof(dis));
    memset(vis,false,sizeof(vis));
    d=0;
    DFS(1,0);
    memset(vis,false,sizeof(vis));
    d=0;
    DFS(p,1);
    cout<<d<<endl;
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章