此题求的是树的最长链, 要注意此题不能用dis[maxn][maxn]来记录a, b两点的距离,这样会超空间, 也就是超内存,要用另一种储存方式储存。此题思想很简单, 随便选一个点,搜此点能到的最远距离, 并记录最远距离的点, 然后再从最远距离的点搜这点能到的最远距离, 这个dis就是答案。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#define mem(a) memset(a, 0, sizeof(a))
using namespace std;
int m, n, ans, flag, num, head[100005];
bool vis[100005];
struct eage
{
int to;
int next;
int eg;
}e[100005];
void add(int a, int b, int eg)
{
e[num].to = b;
e[num].eg = eg;
e[num].next = head[a];
head[a] = num++;
e[num].to = a;
e[num].eg = eg;
e[num].next = head[b];
head[b] = num++;
}
void bfs(int a)
{
int dis = 0, he, to;
queue<int> q;
q.push(a);
q.push(dis);
while(!q.empty())
{
he = q.front();
vis[he] = 1;
q.pop();
dis = q.front();
q.pop();
to = head[he];
while(vis[e[to].to] == 1&&to != -1)
{
to = e[to].next;
}
while(to != -1&&vis[e[to].to] == 0)
{
q.push(e[to].to);
q.push(dis + e[to].eg);
if(ans < (dis + e[to].eg))
ans = dis + e[to].eg, flag = e[to].to;
to = e[to].next;
while(vis[e[to].to] == 1&&to != -1)
{
to = e[to].next;
}
}
}
}
int main(int argc, char *argv[])
{
int i, j, k, l;
ans = 0;
num = 0;
mem(e);
mem(vis);
memset(head, -1, sizeof(head));
scanf("%d%d",&m, &n);
for(i = 0;i < n;i++)
{
scanf("%d%d%d%*c%*c%*c", &j, &k, &l);
add(j, k, l);
}
bfs(1);
mem(vis);
bfs(flag);
printf("%d\n", ans);
return 0;
}