↓ Skip to main content
  1. Posts/

poj 2631 Roads in the North (树的直径)

·380 words·1 min
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

poj2631 题意:一棵树中求两个点的最远距离。。。 思路:就是求树的直径。。。裸体。。。。1A

代码实现
  1/* ***********************************************
  2Author :111qqz
  3Created Time :2016年07月12日 星期二 13时03分39秒
  4File Name :code/poj/2631.cpp
  5************************************************ */
  6
  7#include <cstdio>
  8#include <cstring>
  9#include <iostream>
 10#include <algorithm>
 11#include <vector>
 12#include <queue>
 13#include <set>
 14#include <map>
 15#include <string>
 16#include <cmath>
 17#include <cstdlib>
 18#include <ctime>
 19#define fst first
 20#define sec second
 21#define lson l,m,rt<<1
 22#define rson m+1,r,rt<<1|1
 23#define ms(a,x) memset(a,x,sizeof(a))
 24typedef long long LL;
 25#define pi pair < int ,int >
 26#define MP make_pair
 27
 28using namespace std;
 29const double eps = 1E-8;
 30const int dx4[4]={1,0,0,-1};
 31const int dy4[4]={0,-1,1,0};
 32const int inf = 0x3f3f3f3f;
 33const int N=1E4+7;
 34int n,m;
 35vector < pi> edge[N];
 36int lst;
 37int ans;
 38int d[N];
 39bool vis[N];
 40
 41
 42void bfs( int s)
 43{
 44    ms(d,0x3f);
 45    ms(vis,false);
 46    queue<int>q;
 47    q.push(s);
 48    vis[s] = true;
 49    d[s] =  0 ;
 50
 51    while (!q.empty())
 52    {
 53	int u = q.front() ; q.pop();
 54	lst = u ;
 55//	cout<<"u:"<<u<<endl;
 56	int siz = edge[u].size();
 57
 58	for ( int i = 0 ; i < siz ; i++)
 59	{
 60	    int v = edge[u][i].fst;
 61	    if (vis[v]) continue;
 62	    vis[v] = true;
 63	    d[v] = d[u] + edge[u][i].sec;
 64	    ans = max(d[v],ans);
 65	    q.push(v);
 66	}
 67    }
 68
 69    int mx = 0;
 70    for ( int i = 1 ; i <= n ; i++)
 71    {
 72//	cout<<"i:"<<i<<" d[i]:"<<d[i]<<endl;
 73	if (d[i]>mx)
 74	{
 75	    mx = d[i];
 76	    lst = i ;
 77	}
 78    }
 79
 80}
 81int main()
 82{
 83	#ifndef  ONLINE_JUDGE
 84	freopen("code/in.txt","r",stdin);
 85  #endif
 86
 87	int u,v,w;
 88	m = 0;
 89	n = 0;
 90	while (scanf("%d%d%d",&u,&v,&w)!=EOF)
 91	{
 92	    edge[u].push_back(make_pair(v,w));
 93	    edge[v].push_back(make_pair(u,w));
 94	    m++;
 95	    n = max(n,u);
 96	    n = max(n,v);
 97	}
 98	ans = inf;
 99	bfs(1);
100	ans = 0;
101//	cout<<"lst:"<<lst<<endl;
102	bfs(lst);
103	cout<<ans<<endl;
104
105  #ifndef ONLINE_JUDGE
106  fclose(stdin);
107  #endif
108    return 0;
109}

Related

poj 1985 Cow Marathon (树的直径模板题)

·728 words·2 mins
poj1985 题意:求树上两点的最长距离。。。也就是传说中的树的直径。。。 思路: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径; 原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点 证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾) 2) 如果u不是直径上的点,则u到v必然于树的直径相交(反证),那么交点到v 必然就是直径的后半段了 所以v一定是直径的一个端点,所以从v进行BFS得到的一定是直径长度

ural 1416. Confidential (次小生成树模板题)

·730 words·2 mins
URAL1416 题意:次小生成树模板题 思路:用Kruskal求最小生成树,标记用过的边。求次小生成树时,依次枚举用过的边,将其去除后再求最小生成树,得出所有情况下的最小的生成树就是次小的生成树。复杂度o(m2)。。。貌似有其他优化。。。

BZOJ 1681: [Usaco2005 Mar]Checking an Alibi 不在场的证明 (spfa)

·1064 words·3 mins
1681: [Usaco2005 Mar]Checking an Alibi 不在场的证明 # Time Limit: 5 Sec Memory Limit: 64 MB Submit: 250 Solved: 178 [Submit][Status][Discuss] Description # A crime has been comitted: a load of grain has been taken from the barn by one of FJ’s cows. FJ is trying to determine which of his C (1 <= C <= 100) cows is the culprit. Fortunately, a passing satellite took an image of his farm M (1 <= M <= 70000) seconds before the crime took place, giving the location of all of the cows. He wants to know which cows had time to get to the barn to steal the grain. Farmer John’s farm comprises F (1 <= F <= 500) fields numbered 1..F and connected by P (1 <= P <= 1,000) bidirectional paths whose traversal time is in the range 1..70000 seconds (cows walk very slowly). Field 1 contains the barn. It takes no time to travel within a field (switch paths). Given the layout of Farmer John’s farm and the location of each cow when the satellite flew over, determine set of cows who could be guilty. NOTE: Do not declare a variable named exactly ’time’. This will reference the system call and never give you the results you really want.

poj 2342 Anniversary party (基础树形dp)

·634 words·2 mins
题目链接 题意:n个人的上下级关系形成一棵树..每一个人有一个val(可正可负),要选若干个人参加一个party,要求是一个人和他的直接上级不能同时在场。问参加party的人最大的val之和。

华科软院计组概念复习

·2489 words·5 mins
noip 初赛加强版既视感… 自己手动整理的 第二章 机器数:正负符号数码化后的数据称为机器数。 BCD 码:用二进制编码的十进制数称为 BCD 码。 有权码:每位二进制数码元都有确定权值的编码。 校验码:为了发现或纠正数据传送中出现错误的编码。 浮点数的精度由尾数的位数决定。 第三章 溢出:运算结果超出了机器能表示的数据范围。 溢出的特征:结果的符号与操作数的符号不同。 变形补码:两个符号位的补码(用来检测溢出,00,11说明没有溢出,10,01说明有溢出) 对阶:使阶码相等的过程(原则是小阶码向大阶码看齐) 结果规格化:将非规格化数处理为规格化形式。