Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 2919 | Accepted: 1432 |
Description
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
Output
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;
}