看懂题目意思。他的意思是求将全部的城市走一遍,危急度最小。而且给

你两个s,t后让你求在走的时候,从s到t过程中危急度最大的值,并输出它,

然后就是怎样攻克了,这个题目能够说简单,也能够说难

通过思考能够知道s到t的路径进行遍历就是所谓的答案了

所以通过LCA算法就能够解决这个问题,大家能够去看看LCA在图论上的算法

/*
Author: 2486
Memory: 0 KB Time: 2222 MS
Language: C++11 4.8.2 Result: Accepted
VJ RunId: 4236841 Real RunId: 15859210
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
const int maxn=50000+5;
const int maxm=100000+5;
int N,M,m;
int par[maxn],dist[maxn],depth[maxn],vis[maxn];
struct edge {
int u,v,cost;
bool operator<(const edge &a)const {
return cost<a.cost;
}
} es[maxm];
struct ed {
int to,cost;
ed(int to,int cost):to(to),cost(cost) {}
};
vector<ed>G[maxn];
void init(int c) {
for(int i=0; i<maxn; i++) {
par[i]=i;
dist[i]=-1;
if(c)G[i].clear();
}
memset(vis,false,sizeof(vis));
}
int find(int x) {
return par[x]==x?x:par[x]=find(par[x]);
}
bool same(int x,int y) {
return find(x)==find(y);
}
void unite(int x,int y) {
x=find(x);
y=find(y);
par[x]=y;
}
int lca(int a, int b) { //a的深度<=b的深度
int m1 = -1;
while(depth[a] < depth[b]) { //将深度调到一样
m1 = max(m1, dist[b]);
b = par[b];
}
while(a != b) {//同一时候从节点走到祖先节点
m1 = max(m1, dist[a]);
m1 = max(m1, dist[b]);
a = par[a], b = par[b];
}
return m1;
}
void kj() {
sort(es,es+M);
init(1);
int cnt=0;
/**********将组成最小生成树的边全都保存起来*************/
/**********大家都懂。这是Kruskal算法*************/
for(int i=0; i<M; i++) {
edge e=es[i];
if(!same(e.v,e.u)) {
unite(e.v,e.u);
G[e.v].push_back(ed(e.u,e.cost));
G[e.u].push_back(ed(e.v,e.cost));
}
}
/***********************/
dist[1]=0;
depth[1]=0;
queue<int>F;
F.push(1);
vis[1]=true;
init(0);
/*********这个是非常重要的**************/
/*********以1号城市为根节点,然后就是開始遍历形成一棵树**************/
/***********大家能够想象一下,假设城市在一棵树的某个节点上************/
/***********那么什么才是从一个点到还有一个点的路径呢?************/
/***********非常easy。将他们从他们自己的节点向上递推到两个点的共同祖先就能够了************/
/***********中间经历的就是从一个点到还有一个点的路径************/
/***********如此,就直接用队列处理一下就可以************/
while(!F.empty()) {
int v=F.front();
F.pop();
for(int i=0; i<G[v].size(); i++) {
ed e=G[v][i];
if(vis[e.to])continue;
vis[e.to]=true;
par[e.to]=v;//他的父亲节点
depth[e.to]=depth[v]+1;//他的深度
dist[e.to]=e.cost;//从该节点到父亲节点的危急度
F.push(e.to);
}
}
/***********************/
} int main() {
int cases=1;
//freopen("D://imput.txt","r",stdin);
while(~scanf("%d%d",&N,&M)) {
for(int i=0; i<M; i++) {
scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);
}
if(cases!=1)printf("\n");//注意题目格式,须要换行
kj();
int s,t;
scanf("%d",&m);
while(m--) {
scanf("%d%d",&s,&t);//读取命令
if(depth[s]>depth[t])swap(s,t);
printf("%d\n",lca(s,t));
}
cases++;
}
return 0;
}

UVA - 11354Bond最小生成树,LCA寻找近期公共祖先的更多相关文章

  1. HDU 2586 How far away ?(LCA模板 近期公共祖先啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 Problem Description There are n houses in the vi ...

  2. LintCode 近期公共祖先

    中等 近期公共祖先 查看执行结果 34% 通过 给定一棵二叉树,找到两个节点的近期公共父节点(LCA). 近期公共祖先是两个节点的公共的祖先节点且具有最大深度. 您在真实的面试中是否遇到过这个题? Y ...

  3. LCA近期公共祖先

    LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...

  4. POJ 1470 Closest Common Ancestors【近期公共祖先LCA】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...

  5. 近期公共祖先(LCA)——离线Tarjan算法+并查集优化

    一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...

  6. 连通分量模板:tarjan: 求割点 &amp;&amp; 桥 &amp;&amp; 缩点 &amp;&amp; 强连通分量 &amp;&amp; 双连通分量 &amp;&amp; LCA(近期公共祖先)

    PS:摘自一不知名的来自大神. 1.割点:若删掉某点后.原连通图分裂为多个子图.则称该点为割点. 2.割点集合:在一个无向连通图中,假设有一个顶点集合,删除这个顶点集合,以及这个集合中全部顶点相关联的 ...

  7. LCA 近期公共祖先 小结

    LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...

  8. POJ1330Nearest Common Ancestors——近期公共祖先(离线Tarjan)

    http://poj.org/problem? id=1330 给一个有根树,一个查询节点(u,v)的近期公共祖先 836K 16MS #include<iostream> #includ ...

  9. P5836 [USACO19DEC]Milk Visits S 从并查集到LCA(最近公共祖先) Tarjan算法 (初级)

    为什么以它为例,因为这个最水,LCA唯一黄题. 首先做两道并查集的练习(估计已经忘光了).简单来说并查集就是认爸爸找爸爸的算法.先根据线索理认爸爸,然后查询阶段如果发现他们的爸爸相同,那就是联通一家的 ...

随机推荐

  1. [python测试框架] http接口测试框架

    https://testerhome.com/topics/5631 Http 接口测试框架 (思路 + 实现中 + 开源 + 可能难产) Http 接口测试框架疑问解答 Fiddler 保存会话 ( ...

  2. HDU——2066一个人的旅行(优先队列SPFA水题)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. 常用的Java基本代码汇总

    1.字符串和整型的相互转换 String a= String.valueOf(2); int i = Integer.parseInt(a); 2. 向文件末尾添加内容 BufferedWriter ...

  4. ActiveMQ使用经验与优化

    摘自:http://blog.csdn.net/m13321169565/article/details/8081314 1.1 不要频繁的建立和关闭连接 JMS使用长连接方式,一个程序,只要和JMS ...

  5. 337. House Robber III(包含I和II)

    198. House Robber You are a professional robber planning to rob houses along a street. Each house ha ...

  6. poj 3068 Bridge Across Islands

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11196   Accepted: ...

  7. ObjectDataSource配置数据源的时候,选择业务对象下拉菜单没有任何东西

    原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 问题:在App_Code这个文件夹中添加了一个类,然后保存,但是在ObjectDataSource配置数据源的时候 ...

  8. sublime flatLand 主题

    今天试了下感觉主题不错 记下来备忘. 1.sublime3 package control install  搜索 flatLand 2 安装完成后. 修改 Preferences 文件,通过 Sub ...

  9. Django迁移数据库

    我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建 为了让 Django 完成翻译,创建 ...

  10. AC日记——猴子 cogs 2043

    2043. 猴子 ★★   输入文件:monkeya.in   输出文件:monkeya.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 有n只猴子,第一只尾巴挂在树上 ...