问题描述请大家登陆蓝桥杯官网看吧。在这里就不贴了。
起初我用的是邻接矩阵存储图。最后一个数据n为10000,致使内存超标,运行错误。用邻接表存储图可解决此类问题。(可是到比赛时我们无法知道内存是否超标,那该怎么处理呢)。
若你对从每个结点对树进行深度优先搜索的话,那么将会运行超时。
看了别人的代码提示,我产生了一个思路。对树进行2次深度遍历就可以了。
第一次遍历找出一个包含在最长路中的终端结点,从该终端结点对树进行深度优先搜索就可以找到最长路了。
代码如下:
#include <iostream> #include <cstring> #include <vector> using namespace std; #define MAX(a,b) (a>b)?a:b const int MAX_N=10016; int V; typedef pair<int, int> P; vector<P> G[MAX_N]; int vis[MAX_N]; int ans=-1; int pos; void dfs(int v,int sum) { if(sum>ans) { ans=sum; pos=v; } vis[v]=1; for(int i=0;i<G[v].size();i++) { P pi=G[v][i]; int u=pi.first; if(!vis[u]) { dfs(u,sum+pi.second); } } } int main() { int n; cin>>n; V=n; for(int i=0;i<n-1;i++) { int u,v,cost; cin>>u>>v>>cost; G[u].push_back(P(v,cost)); G[v].push_back(P(u,cost)); } ans=-1; dfs(1,0); memset(vis,0,sizeof(vis)); ans=-1; dfs(pos,0); cout<<(11+10+ans)*ans/2<<endl; return 0; }
时间: 2024-10-15 02:12:37