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

题目链接:点击打开链接

对于一棵无向树:

任意点出发,找到最远点,设这个为起点,从起点出发找到最远点为终点

这条路就是直径

两次BFS;

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define maxn 100010
#define _ll __int64
#define ll long long
#define INF 0x3f3f3f3f
#define Mod 1000000007
#define pp pair<int,int>
#define ull unsigned long long
using namespace std;
vector <int> eg[maxn];
int dis[maxn],n;
int bfs(int src)
{
	memset(dis,0,sizeof(dis));dis[src]=1;
	queue <int> Q;Q.push(src);int E;
	while(!Q.empty())
	{
		int u=Q.front();Q.pop();E=u;
		for(int i=0;i<eg[u].size();i++)
		{
			int v=eg[u][i];
			if(!dis[v])
			{
				dis[v]=dis[u]+1;
				Q.push(v);
			}
		}
	}
	return E;
}
int main()
{
	int u,v;
	while(~scanf("%d",&n))
	{
		if(n==1)
		{
			puts("1");
			continue;
		}
		for(int i=1;i<=n;i++)eg[i].clear();--n;
		while(n--)
		{
			scanf("%d%d",&u,&v);
			eg[u].push_back(v);
			eg[v].push_back(u);
		}
		int ans=bfs(1);
		ans=bfs(ans);
		printf("%d\n",dis[ans]);
	}
	return 0;
}
时间: 2024-08-15 11:29:58

SDUT 3045-迷之图论(树的直径)的相关文章

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

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

SDUTOJ 3045 迷之图论 搜索

找树的直径的方法其实就是先任取一点进行bfs,找到最远的一点,这时最远的一点肯定是最长链端点之一,然后再从这一最远点开始bfs,这时另一个端点就找到了,长度就是bfs的深度. 这道题目看了别人的才猛然想到对啊,你照的点的最长肯定在你要找的最长的上面.开始还以为是树对树有种莫名其妙的恐惧感.... Description FF是图论高手,所以我要出图论且不出流问题. 给出一个树,求树的最长链的长度. Input 多组输入.每组输入的第一行为n(1 <= n <= 100000),代表节点个数,节

牡丹江.2014B(图论,树的直径)

B - Building Fire Stations Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3820 Appoint description:  System Crawler  (2015-08-15) Description Marjar University is a beautiful and peaceful place.

BDFZOI 树的直径

提交次数:2 涉及知识:基础图论/BFS 描述 一棵树T的"直径"定义为结点两两间距离的最大值.给定带权树T,求T的直径长度. 输入 第一行包含2个整数N.M,表示图中共有N个结点和M条无向边.(N <= 5000,M<n)接下来M行,每行包含3个整数{u,v,w},表示有一条无向边连接结点u.v*输入保证是无环图输出一个整数,代表直径长度 样例输入 4 31 2 12 3 22 4 3 样例输出 5 代码: 1 #include<iostream> 2 #in

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搜索

[树的直径] SDOI2013 直径

SDOI2013 直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一棵树上,任意两个节点之间最多有一条简单路径.我们用 dis(a,b)表示点a和点b的路径上各边长度之和.称dis(a,b)为a.b两个节点间的距离. 直径:一棵树上,最长的路径为树的直径.树的直径可能不是唯一的. 现在小Q想知道,对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有

poj 1985 Cow Marathon 【树的直径】

题目:poj 1985 Cow Marathon 题意:给出一个树,让你求树的直径. 分析: 树的直径:树上两点之间的最大距离. 我们从任意一点出发,BFS一个最远距离,然后从这个点出发,在BFS一个最远距离,就是树的直径. AC代码: /* POJ:1985 Cow Marathon 2014/10/12/21:18 Yougth*/ #include <cstdio> #include <iostream> #include <algorithm> #include

poj1849(求树的直径)

题目链接:http://poj.org/problem?id=1849 题意:有一颗n个结点的带权的无向树, 在s结点放两个机器人, 这两个机器人会把树的每条边都走一遍, 但是最后机器人不要求回到出发点. 问你两个机器人走的路总长之和的最小值是多少? 分析:如果从某点出发遍历完一棵树再回来,那么所有边都会走两遍,而从某点有两个机器人出发去遍历,因为不用回来,所以最后那两个人距离越远越好,可以从树的直径上某个点背道而驰,那么这段距离(树的直径)只走了一遍,其他的要走两遍,所以ans=sum*2-l

hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径

题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v(level最深)该点必然是树的直径的一个端点,,再从该点出发,bfs,到最深的一点,该点深度就是直径.(证明:先假设u,是直径上一点,S,T是直径的端点,设v!=t,则有(V,U)+(U,S)>(T,U)+(U,S),矛盾,故t=v:若u不是直径上一点,设u到直径上的一点为x,同理易证. 最后 缩