SDUTOJ 3045 迷之图论 搜索

找树的直径的方法其实就是先任取一点进行bfs,找到最远的一点,这时最远的一点肯定是最长链端点之一,然后再从这一最远点开始bfs,这时另一个端点就找到了,长度就是bfs的深度。

这道题目看了别人的才猛然想到对啊,你照的点的最长肯定在你要找的最长的上面。开始还以为是树对树有种莫名其妙的恐惧感。。。。

Description

FF是图论高手,所以我要出图论且不出流问题。

给出一个树,求树的最长链的长度。

Input

多组输入。每组输入的第一行为n(1 <= n <= 100000),代表节点个数,节点编号从1 到n,接下来的n-1行,每行两个正整数u,v,代表u,v之间有一条边相连。保证每组数据都是一棵树。

Output

对于每组数据,输出一个正整数代表答案。

Sample Input

121 2

Sample Output

12

Hint

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<ctype.h>
#include<queue>
using namespace std;
struct node
{
    int u,v,next;
} edge[200000];
struct w
{
    int step,date;
} t,f;
int cnt,head[200000],vis[200000],p,s;
void add(int u,int v)
{
    edge[cnt].u=u;
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void bfs(int b)
{
    memset(vis,0,sizeof(vis));
    queue<w>q;
    t.step=1;
    t.date=b;
    vis[b]=1;
    q.push(t);
    while(!q.empty())
    {
        t=q.front();
        q.pop();
        p=t.date;
        s=t.step;
        int u=t.date;
        for(int i=head[u]; i!=-1; i=edge[i].next)
        {
            f.date=edge[i].v;
            if(!vis[f.date])
            {
                f.step=t.step+1;
                vis[f.date]=1;
                q.push(f);
            }
        }
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==1)
        {
            printf("1\n");
            continue;
        }
        cnt=0;
        memset(head,-1,sizeof(head));
        for(int i=1; i<n; i++)
        {
            int u,v;
            scanf("%d %d",&u,&v);
            add(u,v);
            add(v,u);
        }
        bfs(1);
        bfs(p);
        printf("%d\n",s);
    }
    return 0;
}
时间: 2024-10-27 22:39:37

SDUTOJ 3045 迷之图论 搜索的相关文章

SDUT OJ 3045 迷之图论 (树的直径)

题目地址:SDUT OJ 3045 这题比赛的时候想的差不多..但是总是觉得不对..写了一次就没再写,然后删了..当时没想到的是第二次求出来的就是最长链..当时想到的两次bfs找最大值(这一种方法其实结果也对..TAT..),还有找到点后在回溯减去重点等等..但总觉得好像都不太对...赛后才知道这题原来是树的直径.....牡丹江区域现场赛的时候遇到过,不过赛后也没看... 找树的直径的方法其实就是先任取一点进行bfs,找到最远的一点,这时最远的一点肯定是最长链端点之一,然后再从这一最远点开始bf

sdut3045迷之图论--(多叉树求最长链)

迷之图论 Time Limit: 1000MS Memory limit: 65536K 题目描述 FF是图论高手,所以我要出图论且不出流问题. 给出一个树,求树的最长链的长度. 输入 多组输入.每组输入的第一行为n(1 <= n <= 100000),代表节点个数,节点编号从1 到n,接下来的n-1行,每行两个正整数u,v,代表u,v之间有一条边相连.保证每组数据都是一棵树. 输出 对于每组数据,输出一个正整数代表答案. 示例输入 121 2 示例输出 12 提示 来源 zmx dfs搜索

【图论 搜索】bzoj1064: [Noi2008]假面舞会

做到最后发现还是读题比赛 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第i 类面具的人才能看到戴第i+1 类面具的人的编号,戴第k 类面具的人能看到戴第1 类面具的人的编号. 参加舞会的人并不知道有多少类面

玩转算法系列--图论精讲 面试升职必备(Java版)

第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真正地,玩转图论算法:) 第2章 图的基本表示千里之行,驶于足下.解决任何有一个图论算法问题,首先需要用基本的数据结构来表示图.在这一章,我们就将探索图的基本表示问题,学习邻接矩阵和邻接表,进而,也让同学们熟悉这个课程的整体代码风格. 第3章 图的深度优先遍历任何一种数据结构,都需要进行遍历.图也不例外.通过深

noip2013 华容道

P1979 华容道 131通过 471提交 题目提供者该用户不存在 标签图论搜索/枚举2013NOIp提高组 难度省选/NOI- 提交该题 讨论 题解记录 最新讨论 要注意部分数据存在起点与终… 求助求助求助 题目数据是不是有问题啊 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一

洛谷 P1656 炸铁路

P1656 炸铁路 题目提供者kkksc03 标签图论搜索/枚举洛谷原创 难度普及/提高- 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵. 该国有n个城市,这些城市以铁路相连.任意两个城市都可以通过铁路直接或者间接到达. uim发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达.这样的铁路就被称为key road. uim为了尽快使该国的物流系统瘫痪,希炸毁铁路,已达到存在某两个城市无法互相通过铁路到达的效果. 然而,只有一发炮

[LeetCode][JavaScript]N-Queens

N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a distinct board configur

redis缓存介绍以及常见问题浅析

# 没缓存的日子: 对于web来说,是用户量和访问量支持项目技术的更迭和前进.随着服务用户提升.可能会出现一下的一些状况: 页面并发量和访问量并不多,mysql足以支撑自己逻辑业务的发展.那么其实可以不加缓存.最多对静态页面进行缓存即可. 页面的并发量显著增多,数据库有些压力,并且有些数据更新频率较低反复被查询或者查询速度较慢.那么就可以考虑使用缓存技术优化.对高命中的对象存到key-value形式的redis中,那么,如果数据被命中,那么可以省经效率很低的db.从高效的redis中查找到数据.

PAT甲级专题|最短路

PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做,只能得20分 #include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 510; int cmax,n,ter,m; int caps[maxn]; int g[maxn][m