两次bfs就可以解决树的最大直径了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#define sf scanf
#define pf printf
using namespace std;
const int N=30005;
int dis[N];
bool vis[N];
typedef struct node
{
int v,w;
}node;
vector<node> G[N];
queue<int> Q;
void bfs(int st,int &ans)
{
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
while(!Q.empty()) Q.pop();
vis[st]=1,dis[st]=0;
Q.push(st);
int mx=-1;
while(!Q.empty())
{
int now=Q.front();
Q.pop();
for(int i=0;i<G[now].size();i++)
{
int to=G[now][i].v , c=G[now][i].w;
if(vis[to]) continue;
dis[to]=dis[now]+c;
vis[to]=1;
if(dis[to]>mx)
{
mx=dis[to];
ans=to;
}
Q.push(to);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int T,ca=0;
node tmp;
int i,a,b,c,n;
sf("%d",&T);
while(T--)
{
sf("%d",&n);
for(i=0;i<n;i++)
G[i].clear();
for(i=1;i<=n-1;i++)
{
sf("%d%d%d",&a,&b,&c);
tmp.v=b,tmp.w=c;
G[a].push_back(tmp);
tmp.v=a;
G[b].push_back(tmp);
}
int S,T;
bfs(0,S);
bfs(S,T);
pf("Case %d: %d\n",++ca,dis[T]);
}
return 0;
}
优雅点的写法:
两次dfs求出树的直径,代码量少很多。(只是作为模板,并不是该题的代码哦!
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int MAX = 130000;
vector<int> adj[MAX];
int d[MAX];
void dfs(int u, int fa)
{
for (int i = 0; i < adj[u].size(); i++)
{
int v = adj[u][i];
if (v != fa)
{
d[v] = d[u] + 1;
dfs(u, v);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
for (int i = 0; i < n - 1; i++)
{
int u, v;
cin >> u >> v;
u--;
v--;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs(0, -1);
int v = -1;
for (int i = 0; i < n; i++)
if (v == -1 || d[v] < d[i])
v = i;
memset(d, 0, sizeof(d));
dfs(v, -1);
int sum = 0;
int mx = 0;
for (int i = 0; i < n; i++)
{
mx = max(mx, d[i]);
}
cout << mx << "\n";
return 0;
}