题目大意:
给你一棵树,求一下直径
题目分析:
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;
}
标签:ch,CF690C2,题解,一棵树,add,cerr
From: https://www.cnblogs.com/larry76/p/17130698.html