蓝桥杯大臣的旅费

问题描述请大家登陆蓝桥杯官网看吧。在这里就不贴了。

起初我用的是邻接矩阵存储图。最后一个数据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;
} 

 

你可能感兴趣的:(蓝桥杯)