zoukankan      html  css  js  c++  java
  • 【BZOJ1509】[NOI2003]逃学的小孩 直径

    【BZOJ1509】[NOI2003]逃学的小孩

    Description

    Input

    第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数。以下M行,每行给出一条街道的信息。第i+1行包含整数Ui、Vi、Ti(1Ui, Vi  N,1  Ti  1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟。街道信息不会重复给出。

    Output

    仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris。

    Sample Input

    4 3
    1 2 1
    2 3 1
    3 4 1

    Sample Output

    4

    题解:显然A和B是直径的两端点吧~(自己瞎证一下,或者瞎yy一下就行)

    然后枚举C就做完了。

     

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    const int maxn=200010;
    typedef long long ll;
    int n,cnt,r1,r2,rt;
    ll ans;
    int to[maxn<<1],next[maxn<<1],head[maxn];
    ll val[maxn<<1],dep[maxn<<1],f[maxn<<1];
    inline int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret*f;
    }
    inline void add(int a,int b,int c)
    {
    	to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
    }
    void dfs(int x,int fa)
    {
    	if(dep[x]>dep[rt])	rt=x;
    	for(int i=head[x];i!=-1;i=next[i])	if(to[i]!=fa)	dep[to[i]]=dep[x]+val[i],dfs(to[i],x);
    }
    int main()
    {
    	n=rd(),rd();
    	int i,a,b,c;
    	memset(head,-1,sizeof(head));
    	for(i=1;i<n;i++)	a=rd(),b=rd(),c=rd(),add(a,b,c),add(b,a,c);
    	dfs(1,0),r1=rt;
    	dep[r1]=0,dfs(r1,0),r2=rt,memcpy(f,dep,sizeof(dep));
    	dep[r2]=0,dfs(r2,0);
    	for(i=1;i<=n;i++)	ans=max(ans,dep[r1]+min(dep[i],f[i]));
    	printf("%lld",ans);
    	return 0;
    }

     

  • 相关阅读:
    C#字符串转换为数字的4种方法
    Linq to SQL Xml Based
    Code Snippets in Visual Studio 2010
    cygwin 压缩
    Cygwin安装Gitolite3
    ubuntu下如何用命令行运行deb安装包
    iconv bom
    __stdcall型dll转lib
    cygwin install lua modules
    luacom cygwin
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7670215.html
Copyright © 2011-2022 走看看