题意:
给点与点间的距离,且点与点间只有一条边,求最长的两点间距离。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
using namespace std;
const int maxn = 10000 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = 4 * atan(1.0);
const double ee = exp(1.0);
struct Node
{
int to;
int len;
Node(int to, int len):to(to), len(len){}
};
vector<Node> g[maxn];
int ans;
int dfs(int fr, int to)
{
int tmax = 0, tans;
for (int i = 0; i < g[fr].size(); i++)
{
int v = g[fr][i].to;
if (v != to)
{
tans = dfs(v, fr) + g[fr][i].len;
ans = max(ans, tans + tmax);
tmax = max(tmax, tans);
}
}
return tmax;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
char str[50];
bool eof = false;
while (!eof)
{
for (int i = 0; i < maxn; i++)
g[i].clear();
while (1)
{
if (gets(str) == 0)
{
eof = true;
break;
}
if (str[0])
{
int fr, to, len;
sscanf(str, "%d%d%d", &fr, &to, &len);
g[fr].push_back(Node(to, len));
g[to].push_back(Node(fr, len));
}
else
break;
}
ans = 0;
dfs(1, -1);
printf("%d\n", ans);
}
return 0;
}