#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define MAXN 10005
#define MAXM 100005 using namespace std; struct Edge { int from; int to; int val; int next; }; int n;
int m;
int q;
int cnt;
int num;
int f[MAXN];
int lv[MAXN];
int vis[MAXN];
int dis[MAXN];
int pre[MAXN];
int head[MAXN]; Edge s[MAXM],edge[MAXM]; inline bool cmp(Edge x,Edge y) { return x.val>y.val; } inline int find(int x)
{
if (f[x]!=x) return f[x]=find(f[x]);
return f[x];
} inline void add(int u,int v,int w)
{
edge[++cnt].from=u;
edge[cnt].to=v;
edge[cnt].val=w;
edge[cnt].next=head[u];
head[u]=cnt; return ;
} inline void dfs(int u)
{
for (int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (!vis[v])
{
pre[v]=u; vis[v]=;
dis[v]=min(dis[v],edge[i].val);
lv[v]=lv[u]+; dfs(v);
}
} return ;
} inline int work(int x,int y)
{
int ans=;
while(lv[x]>lv[y]) ans=min(ans,dis[x]),x=pre[x];
while(lv[y]>lv[x]) ans=min(ans,dis[y]),y=pre[y];
while(x!=y) ans=min(ans,min(dis[x],dis[y])),x=pre[x],y=pre[y];
return ans;
} inline void solve()
{
scanf("%d%d",&n,&m); memset(dis,0x7f,sizeof(dis));
for (int i=;i<=n;i++) f[i]=i;
for (int i=;i<=m;i++)
scanf("%d%d%d",&s[i].from,&s[i].to,&s[i].val);
sort(s+,s++m,cmp); num=; cnt=;
for (int i=;i<=m&&num!=n-;i++)
{
int fa=find(s[i].from); int fb=find(s[i].to);
if (fa!=fb)
{
f[fa]=fb; num++;
add(s[i].from,s[i].to,s[i].val);
add(s[i].to,s[i].from,s[i].val);
}
} scanf("%d",&q); memset(vis,,sizeof(vis));
for (int i=;i<=n;i++)
if (!vis[i]) pre[i]=,lv[i]=vis[i]=,dfs(i);
for (int i=;i<=q;i++)
{
int a; int b; scanf("%d%d",&a,&b);
int fa=find(a); int fb=find(b);
if (fa!=fb) printf("-1\n");
else printf("%d\n",work(a,b));
} return ;
} int main()
{
solve();
return ;
}
废话我就不多说了 最初这道题写的是最大生成树加DFS搜索的 只能得到六十分 后来改成DFS的预处理 预处理的复杂度是O(n)的。
然后对于每一次询问 我这个算法的时间复杂度最坏是O(n)的。 也就是一棵树有两条链 询问的两个点分别是两条链底部的点。
不过数据显然没有这么水的  所以复杂度一般低于O(n)。 
说一说做法哈  先预处理所有的边 求出最大生成树 没有的话无所谓 只要所有的边扫一下 判边的话我用的是并查集维护 
把可以要的边留下就好 然后把这些边连起来
 对于每一个没有搜索过的点就去DFS搜一下 对于搜到的每一个节点要做一个等级标记 根节点等级是1 根节点的所有子节点等级是2 以此类推
DFS过程中记录一下每个点的前驱 以及每个点到它父亲的路径的权值 最后对于每一个询问AB两点
我用语言是不好说的 详情请看代码中的work代码 应该是非常容易理解的 嗯~ o(* ̄▽ ̄*)o 小编就先说到这里吧
如果看了有什么不懂的地方就在下面评论吧 小编会在12小时内给你满意的答复的 谢谢大家o(* ̄▽ ̄*)ブ

NOIP 2013 货车运输 最大生成树加DFS巧妙AC的更多相关文章

  1. NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】

    NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...

  2. [NOIp 2013]货车运输

    Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重 ...

  3. NOIP 2013货车运输

    当然这题有很多做法,但是我看到没有人写DSU的很惊奇 按照之前做连双向边题的经验,这题可以用并查集维护联通 然后对于每个询问\(x,y\),考虑启发式合并 当两个点集\(x,y\)合并时,一些涉及到其 ...

  4. NOIP提高组 2013货车运输

    觉得题目水的离开 不屑的大佬请离开 不会图论的请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 题面: 题目描述 A 国有 n 座城市,编号从 1 到 ...

  5. 【NOIP】提高组2013 货车运输

    [算法]最大生成树+LCA(倍增) [题解]两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的. 先求原图的最大生成树(森林),重新构图,然后用一 ...

  6. 题解 【luoguP1967 NOIp提高组2013 货车运输】

    题目链接 题解 题意 给你一个无向图,求两个点之间的一条路径,使路径上的最小值最大 算法:Kruskal最大生成树+倍增lca 分析 首先容易知道,答案一定在该图的最大生成树上 之后问题便转换成了树上 ...

  7. TZOJ 4848 货车运输(最大生成树+倍增lca)

    描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...

  8. 【NOIP2013】货车运输 最大生成树+LCA

    题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...

  9. $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$

    $Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...

随机推荐

  1. js获取cookie 和 模仿php的&_GET方法

    //获取get参数 function _get(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)( ...

  2. merge 本地 master 分支代码提示 “Already up-to-date”

    在使用 git 的过程中由于误操作,导致从本地 master 分支 merge 代码到当前分支失败,虽然当前分支和 master 分支代码不同步,但是仍然提示 Already up-to-date. ...

  3. jquery中css获取颜色属性

    Jquery获取颜色的方法为: var color = $(元素).css("color"); alert(color); 可以看到color如这样的格式; 但是; 因为rgb(0 ...

  4. C#类继承和接口继承时一些模棱两可的问题[转]

    原文地址:http://www.cnblogs.com/harleyhu/archive/2012/11/29/2794809.html 1.在father定义的方法若含有virtual关键字,chi ...

  5. C++学习笔记 指针与引用

    指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

  6. Android四大核心组件之Service

    实验内容 启动Service 绑定Service 与Service进行通信 实验要求 启动Service 绑定Service 与Service进行通信 实验步骤 Service概述 Service通常 ...

  7. 解决Ubuntu "E: 软件包 vim 还没有可供安装的候选者"问题

    sudo apt-get update 试着运行这段代码后再尝试sudo apt-get install 安装语句

  8. Shopex4.85商派2014年商业模板和商业插件共600多套仅售600元送分销王2代SEO排名神具。

    这批shopex商业插 件+模板都是本人从官方模板网站收购.高价.交换.以及收藏得来.本人因现实工作太忙不得不转手出售这批源代码,限时低价出售给和我一样从事shopex 系统网店电子商务的兄弟姐妹们, ...

  9. http 中定义的八种请求的介绍

    在http1.1协议中,共定义了8种可以向服务器发起的请求(这些请求也叫做方法或动作),本文对这八种请求做出简要的介绍: 1.PUT:put的本义是推送 这个请求的含义就是推送某个资源到服务器,相当于 ...

  10. 代码高亮美化插件-----SyntaxHighlighter

    IT类文章博客,代码高亮美化插件-----SyntaxHighlighter 最近在做一个类似个人博客的网站,因为文章中会用到各种代码,主要是Javascript,CSS,PHP,XML等.这些代码如 ...