Codeforces 14D Two Paths 树的直径

题目链接:点击打开链接

题意:给定一棵树

找2条点不重复的路径,使得两路径的长度乘积最大

思路:

1、为了保证点不重复,在图中删去一条边,枚举这条删边

2、这样得到了2个树,在各自的树中找最长链,即树的直径,然后相乘即可

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
#include<vector>
#include<map>
#include<math.h>
#include<queue>
#include<string>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 220
struct Edge {
	int from, to, nex;
	bool hehe;
}edge[N<<1];
int head[N], edgenum;
void add(int u, int v){
	Edge E={u,v,head[u],true};
	edge[edgenum] = E;
	head[u] = edgenum ++;
}
int n;
int dis[N];
void init(){ memset(head, -1, sizeof head);	edgenum = 0; }
int bfs(int x){
	memset(dis, 0, sizeof dis);
	dis[x] = 1;
	queue<int>q; q.push(x);
	int hehe = x;
	while(!q.empty()) {
		int u = q.front(); q.pop();
		for(int i = head[u]; ~i; i = edge[i].nex) {
			if(!edge[i].hehe)continue;
			int v = edge[i].to;
			if(dis[v])continue;
			dis[v] = dis[u]+1, q.push(v);
			if(dis[hehe]<dis[v])hehe = v;
		}
	}
	return hehe;
}
int main(){
	int i, u, v;
	while(~scanf("%d",&n)){
		init();
		for(i=1;i<n;i++){
			scanf("%d %d",&u,&v);
			add(u,v); add(v,u);
		}
		int ans = 0;
		for(i = 0; i < edgenum; i+=2)
		{
			edge[i].hehe = edge[i^1].hehe = false;
			u = edge[i].from; v = edge[i].to;
			int L1 = bfs(u); int R1 = bfs(L1);
			int mul1 = dis[R1] -1;
			int L2 = bfs(v); int R2 = bfs(L2);
			int mul2 = dis[R2] -1;
			ans = max(ans, mul1 * mul2);
			edge[i].hehe = edge[i^1].hehe = true;
		}
		printf("%d\n",ans);
	}
	return 0;
}

Codeforces 14D Two Paths 树的直径

时间: 2024-10-13 23:00:57

Codeforces 14D Two Paths 树的直径的相关文章

Codeforces 455C Civilization:树的直径 + 并查集【合并树后直径最小】

题目链接:http://codeforces.com/problemset/problem/455/C 题意: 给你一个森林,n个点,m条边. 然后有t个操作.共有两种操作: (1)1 x: 输出节点x所在树的直径. (2)2 x y: 如果x,y不在同一棵树上的话,用一条边连接x,y所在的树,并且使得到的新树的直径尽可能小. 题解: 首先对于初始状态,算出每一棵树的直径d[find(i)]. 每次合并树的时候,因为要尽可能让新树直径变小,所以显然这条边要分别连接两棵树直径的“中点”. 所以新树

拓扑排序,树的直径模板(CF14D 枚举删边)

HDU4607 树的直径 #include <stdio.h> #include <string.h> #include <iostream> #include <queue> #include <vector> using namespace std; #define N 100005 #define INF 1<<30 int n,dis[N],E; bool vis[N]; vector<int>G[N]; //注意

CodeForces 14D 树的直径 Two Paths

给出一棵树,找出两条不相交即没有公共点的路径,使得两个路径的长度的乘积最大. 思路:枚举树中的边,将该边去掉,分成两棵树,分别求出这两棵树的直径,乘起来维护一个最大值即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 200 + 10; 8 9

树的直径 Codeforces Beta Round #14 (Div. 2) D. Two Paths

tiyi:给你n个节点和n-1条边(无环),求在这个图中找到 两条路径,两路径不相交,求能找的两条路径的长度的乘积最大值: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <stack>

codeforces 14D 树的直径

题目大意:给你一棵树,要进行两次访问,两次访问中不能重复访问任一节点和边,问两次访问的最大长度乘积,每边 长度为1 思路:因为n只有200,所以可以枚举从哪里将树分成两棵树即删除一条边,求两棵树的直径,维护乘积最大值即可.树的直径在以前的博文讲过,两遍dfs即可 #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <fstream>

codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” consists of n servers and m two-way communication links. Two servers can communicate either through a direct link, or through a chain of links, by relayi

codeforces 455C C. Civilization(树形dp+树的直径+并查集)

题目链接: codeforces 455C 题目大意: 给出一些点,他们之间初始存在一些边,给出两种操作,第一种是查询某个点所在的树的直径,另一种是将两个树合并,要求使合并后的树的直径最小. 题目分析: 首先算取没做操作前的连通块里的树的直径,也就是先dfs一遍,找到深度最大的点,然后从这个点再搜,找到的最远的距离就是这棵树的直径,因为可以证明从根搜深度最大的点一定是树的直径的一个端点,因为它可以通过到达次大的深度的点或者找到与它公共祖先不在根处的获得树的直径. 然后每次合并,我们可以知道得到的

codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” consists of n servers and m two-way communication links. Two servers can communicate either thr

树的直径| CF#615Div3 F. Three Paths on a Tree

F. Three Paths on a Tree 思路 两种方法: 1.两次bfs求树的直径,顺便求出一个直径端点到所有点的最短距离:再bfs一次,求另一个直径上的端点到其它所有点的最短距离:之后枚举第三个端点(不等于端点1和端点2),dis(a,b) + dis(b,c) + dis(a,c) 再除以 2 就是最终答案,因为每个路径走了两次所以除以2. 2.dfs求树的直径,记录直径上的所有点.从直径上的所有点去搜索它们到不在直径上的点的最远距离.最后直径+这个最远距离就是答案 代码1 bfs