题解 CF690C2
题目大意:
给你一棵树,求一下直径
题目分析:
emm,怎么说吧,就是树的直径的裸板子。
可能有人不大理解,明明是图,你为什么要说是给定一棵树。
大家可以自行验证一下,满足如下两个性质的是否是一棵树:
- 任意两个点之间是相互联通的
- 删掉任意一条边则不满足上一条性质
然后树上的最长路显然是树的直径。
代码实现:
#include <bits/stdc++.h>
#define debug(x) cerr<<#x<<": "<<x<<endl;
#define int long long
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
namespace Larry76{
    const int MAX_SIZE = 2.1e5;
    int head[MAX_SIZE];
    int Next[MAX_SIZE];
    int ver[MAX_SIZE];
    int tot;
    int d = -1;
    int n,m;
    void add(int u,int v){
        ver[++tot] = v;
        Next[tot] = head[u];
        head[u] = tot;
    }
    int f[MAX_SIZE];
    int vis[MAX_SIZE];
    void dp(int u){
        vis[u] = true;
        for(int i=head[u];i;i=Next[i]){
            int v = ver[i];
            if(vis[v])
                continue;
            dp(v);
            d = max(d,f[u]+f[v]+1);
            f[u] = max(f[u],f[v]+1);
        }
    }
    void main(){
        //Code Here;
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            int u,v;
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        dp(1);
        cout<<d<<endl;
    }
}
signed main(){
#ifdef LOCAL
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
    double c1 = clock();
#else
    ios::sync_with_stdio(false);
#endif
//============================================
    Larry76::main();
//============================================
#ifdef LOCAL
    double c2 = clock();
    cerr<<"Used Time: "<<c2-c1<<"ms"<<endl;
    if(c2-c1>1000)
        cerr<<"Warning!! Time Limit Exceeded!!"<<endl;
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号