https://hihocoder.com/problemset/problem/1050
//树的直径
//8 树的结点数 这里树边数=结点数-1
//1 2
//1 3
//1 4
//4 5
//3 6
//6 7
//7 8
//法一(不带权重的模板)一次DFS+快速输入
//效率上来说法一比法二好,不论带不带快速输入
#include<cstdio>
#include<iostream>
using namespace std;
#include<cstring>
#include<algorithm>
const int maxn=1e5+5;
struct note {
int to,next;
} edge[maxn<<1];
int head[maxn],n,top;
inline void ADD(int u,int v) {
edge[top].to=v;
edge[top].next=head[u];
head[u]=top++;
edge[top].to=u;
edge[top].next=head[v];
head[v]=top++;
}
int dfs(int now,int fa,int& Max) {
int Dmax=0,Dsec=0;
for(int i=head[now]; ~i; i=edge[i].next) {
int to=edge[i].to;
if(to^fa) {
int nowd=dfs(to,now,Max)+1;
if(nowd>Dmax){
Dsec=Dmax,Dmax=nowd;
}else if(nowd>Dsec){
Dsec=nowd;
}
}
}
Max=max(Max,Dmax+Dsec);
return Dmax;
}
char C;
int val;
inline void SI(){
while((C=getchar())&&(C>'9'||C<'0')){}
val=0;
do{
val=(val<<1)+(val<<3)+C-'0';
C=getchar();
}while(C>='0'&&C<='9');
}
int main() {
while(~scanf("%d",&n)) {
top=0;
memset(head,-1,sizeof(head));
for(int i=1; i<n; ++i) {
int u,v;
SI();
u=val;
SI();
v=val;
ADD(u,v);
}
int Max=0;
dfs(1,-1,Max);
printf("%d\n",Max);
}
return 0;
}
//法二(带权重)两次BFS
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 100000
using namespace std;
int head[MAX];
int vis[MAX];//标记当前节点是否已经用过
int dis[MAX];//记录最长距离
int n,m,ans;
int sum;//记录最长路径的长度
int aga;
struct node
{
int u,v,w;
int next;
}edge[MAX];
void add(int u,int v,int w)//向邻接表中加边
{
edge[ans].u=u;
edge[ans].v=v;
edge[ans].w=w;
edge[ans].next=head[u];
head[u]=ans++;
}
void getmap()
{
int i,j;
int a,b,c;
ans=0;
memset(head,-1,sizeof(head));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
}
void bfs(int beg)
{
queue<int>q;
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
int i,j;
while(!q.empty())
q.pop();
aga=beg;
sum=0;
vis[beg]=1;
q.push(beg);
int top;
while(!q.empty())
{
top=q.front();
q.pop();
for(i=head[top];i!=-1;i=edge[i].next)
{
if(!vis[edge[i].v])
{
dis[edge[i].v]=dis[top]+edge[i].w;
vis[edge[i].v]=1;
q.push(edge[i].v);
if(sum<dis[edge[i].v])
{
sum=dis[edge[i].v];
aga=edge[i].v;
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
getmap();
bfs(1);//搜索最长路径的一个端点
bfs(aga);//搜索另一个端点
printf("%d\n",sum);
}
return 0;
}
hihocoder-1050
最新推荐文章于 2019-01-07 22:26:26 发布