POJ2631 : Roads in the North

2024-03-02 08:08
文章标签 roads north poj2631

本文主要是介绍POJ2631 : Roads in the North,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:嘤嘤嘤

题目大意:给你一个无向带权树,让你求最长路径(树的直径)

解题思路:任选一个点,用dfs跑一遍,记录与这个点最远的点s,再从s点dfs一遍,即可求得直径。

数据给的 n <= 1e4,然而枚举每一个点都用dfs跑一遍居然也能过...这题数据有点水。

证明如下:

这里给出树的直径的证明: 
主要是利用了反证法: 
假设 s-t这条路径为树的直径,或者称为树上的最长路 
现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍dfs就可以找出树的最长路。 
证明: 
   1.设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则 dis(u,T) >dis(u,s) 且 dis(u,T)>dis(u,t) 则最长路不是s-t了,与假设矛盾 
   2.设u不为s-t路径上的点 
   首先明确,假如u走到了s-t路径上的一点,那么接下来的路径肯定都在s-t上了,而且终点为s或t,在1中已经证明过了 
   所以现在又有两种情况了: 
     1:u走到了s-t路径上的某点,假设为X,最后肯定走到某个端点,假设是t ,则路径总长度为dis(u,X)+dis(X,t) 
   2:u走到最远点的路径u-T与s-t无交点,则dis(u-T) >dis(u,X)+dis(X,t);显然,如果这个式子成立,则dis(u,T)+dis(s,X)+dis(u,X)>dis(s,X)+dis(X,t)=dis(s,t)最长路不是s-t矛盾

就不贴原文链接了,相同的太多,也不知道谁是真的作者。(反正不是我写的)

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#define FAST ios::sync_with_stdio(false)
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = (int)1e5 + 5;
const int mod = (int)1e9 + 7;
using namespace std;vector< pair<int, int> > vec[maxn];
int dis[maxn];
bool vis[maxn];
int ans, S;void DFS(int u)
{vis[u] = true;if(dis[u] > ans){ans = dis[u];S = u;}int Size = vec[u].size();for(int i = 0; i < Size; i++){int v = vec[u][i].first;int w = vec[u][i].second;if(!vis[v]){dis[v] = dis[u] + w;DFS(v);}}
}int main()
{int u, v, w;while(~scanf("%d %d %d", &u, &v, &w)){vec[u].push_back(make_pair(v, w));vec[v].push_back(make_pair(u, w));}ans = 0;DFS(1);memset(vis, false, sizeof(vis));ans = 0;memset(dis, 0, sizeof(dis));DFS(S);printf("%d\n", ans);return 0;
}

学会了pair很开心

over.

这篇关于POJ2631 : Roads in the North的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765449

相关文章

hdu 1301 Jungle Roads (基础最小生成树)

题目:         链接:点击打开链接 题意:         对n个村庄之间的路进行修理, 然后是n-1行,每行的第一组数据时一个大写字母VIL和一个数K,Vil表示从这个村庄出发,K表示刚才的那个字母代表的村庄和其他村庄的路的数目,接下来在同一行是K组数据,每组是一个大写字母和一个数,大写字母表示和第一个村庄连接的村庄,数表示维修他们之间的路所需的费用。现在为了使维修费油最低,只需所

NYOJ 434 POJ 1251 Jungle Roads(最小生成树)

链接:click here 题意: 题目大意在相通n个岛屿的所有桥都坏了,要重修,重修每一个桥所用的时间不同,求重修使每个岛屿都间接或直接与其他岛屿相同时所用的的最短时间(只有修完一个桥后才可修下一个桥)。简言之就是求最小生成树。 对于数据,数据输入的第一行n代表岛屿的个数,当为0是结束程序,接着n-1行开始时为这岛屿的编号,用大写字母表示,接着是一个整数m,表示与该岛屿连接的字典序

道路交通英语 English for Roads and Transportation

COLLECTED FROM THE INTERNET 每日雅思 100个交通规则专用英语 交通规则  traffic regulation 路标    guide post 里程碑   milestone 停车标志  mark car stop 红绿灯   traffic light 自动红绿灯 automatic traffic signal light 红灯    red light 绿灯

poj1724--ROADS(最短路变形)

题目链接:点击打开链接 题目大意:给出n个点,m条路径(有向),每条边有一个花费和一个长度,要求在给定的花费内求1到n的最短路径 用dis[i][j]表示从1到i点,花费为j的最短路径,跑spfa,求出最短路 #include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace

poj3411--Paid Roads(bfs+状压)

题目链接:点击打开链接 题目大意:有n个点,m条有向边,经过边需要一个花费,a b c p q代表 a到b的一条道路,如果经过这条边之前经过c点,那么需要p的花费,否则需要q的花费,问从1点到n点的最小花费。 方法1、每条边可能会经过多次,每个点也可以经过多次,这样就没有了边界不能直接进行dfs,因为要记录之前经过的边,所以使用状压,dis[i][j]:当前在第i个点,j表示经过了的点,这样就

POJ 2421 Constructing Roads (MST)

题中给了n*n的矩阵,值是i点到j点的建边的花费,其中已经建好了m条边,题中求还需要花费多少才能使该图连通 思路:Kruskal更好做(并查集)。初始化之后,将m条边依次加入并查集,只要能合并及时合并。 /************************************************ Author: fisty* Created Time: 2015/2/28 14:04

POJ 1251 Jungle Roads (MST)

输入的时候需要转化 /************************************************ Author: fisty* Created Time: 2015/2/28 12:27:44* File Name : A.cpp*********************************************** */#include <iostrea

HDU 1102 Constructing Roads

这道题的要求是任意两个地点必须直接相连或者只通过一个地方间接相连。 所以合并a,b的时候,不只是把a和b并在一起,具体见UNION函数。 然后就是Kruskal算法求最小生成树就行了。 int N,Q; //边 struct edge{int from,to;int value;void init(int from,int to,int value){this->from=fr

hnu 12947 Absurdistan Roads

hnu 12947  网址  http://acm.hnu.cn/online/?action=problem&type=show&id=12947 给出n    和 n*n的矩阵  a(i,j)表示i 到j 的距离   然后求n条边 是的这个最短路成立 用求最小生成树的方法求出n-1条边 这n-1条边肯定是有用的  主要是如何求出第n条边 用floyd求出任意两点之间的最短距离

UVa 10308 Roads in the North 树的直径

题目来源:UVa 10308 Roads in the North 题意:求距离最远的2点之间的距离 思路:裸的树的直径 或者树形DP #include <cstdio>#include <cstring>#include <queue>using namespace std;const int maxn = 100010;struct node{int to, w;node()