题目
https://vjudge.net/problem/POJ-2631
思路
求树的直径模板题…
树的直径:树上两个节点之间最远的距离(类比圆的直径)
方法一:两次DFS
- ① 从任意一点P出发,通过DFS寻找离它最远的点Q
- ② 再次从点Q出发,通过DFS寻找离它最远的W
- ③ 直径即为WQ
证明过程略,可以用反证法
方法二:树形DP
待填坑ing…
代码
#include <iostream>
#include <vector>
#include <cstring>
#define MAXX 10005
using namespace std;
struct Node //链表的形式
{
vector<int> v;
int road[MAXX];
} node[MAXX];
bool vis[MAXX];
int ans,p;
void DFS(int i, int l);
int main()
{
int x, y, l;
while (cin >> x >> y >> l) //连接成图
{
node[x].v.push_back(y);
node[y].v.push_back(x);
node[x].road[y] = l;
node[y].road[x] = l;
}
ans=0;
memset(vis,0,sizeof vis);
DFS(1,0);
ans = 0;
memset(vis,0,sizeof vis);
DFS(p,0);
cout<<ans<<endl;
return 0;
}
void DFS(int i, int l)
{
vis[i] = true;
if (l>ans)
{
ans = l;
p = i;
}
for (int j = 0; j < node[i].v.size(); ++j)
{
int k = node[i].v[j];
if (vis[k])
continue;
DFS(k,l+node[i].road[k]);
}
}
注意
米有…(︶^︶)