蓝桥杯_ 历届试题 大臣的旅费

思路:这个题其实就是找树的最大直径,两遍dfs就可以

#include 
#include 
#include 
#include 
#include 

using namespace std;
const int maxn=50000+50;
vector >g[maxn];
int vis[maxn];
int d1[maxn];
int idx1,idx2;
int ma1,ma2;
void  dfs1(int u,int t)
{
    if(vis[u])
        return ;
    vis[u]=1;
    for(int i=0; ima1)
        {
            ma1=t+c;
            idx1=v;
        }
        dfs1(v,t+c);
    }
}
void dfs2(int u,int t)
{
    if(vis[u])
        return;
    vis[u]=1;
    for(int i=0; ima2)
        {
            ma2=t+c;
            idx2=v;
        }
        dfs2(v,t+c);
    }
}
int main()
{

    int n;
    cin>>n;
    idx1=0;
    idx2=0;
    for(int i=0; i>x>>y>>c;
        g[x].push_back(make_pair(y,c));
        g[y].push_back(make_pair(x,c));
    }
    ma1=-1,ma2=-1;
    dfs1(1,0);
    memset(vis,0,sizeof(vis));
    dfs2(idx1,0);
    long long ans=ma2*10+ma2*(1+ma2)/2;
    cout<

你可能感兴趣的:(蓝桥杯_ 历届试题 大臣的旅费)