#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)
{
    ;
    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));
    ;i<=n;i++) f[i]=i;
    ;i<=m;i++)
        scanf("%d%d%d",&s[i].from,&s[i].to,&s[i].val);
    sort(s+,s++m,cmp); num=; cnt=;
    ;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(,sizeof(vis));
    ;i<=n;i++)
        ,lv[i]=vis[i]=,dfs(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();
    ;
}
废话我就不多说了 最初这道题写的是最大生成树加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货车运输

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

  4. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...

  5. NOIP2013 货车运输 (最大生成树+树上倍增LCA)

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

  6. Codevs3278[NOIP2013]货车运输

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond      题目描述 Description A 国有 ...

  7. C++之路进阶——codevs3287(货车运输)

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description A 国有 n ...

  8. 洛谷 P1967 货车运输

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

  9. NOIP 2013

    Prob.1 转圈游戏 找到循环节,然后快速幂.代码: #include<cstdio> #include<cstring> #include<iostream> ...

随机推荐

  1. #研发解决方案介绍#IdCenter(内部统一认证系统)

    郑昀 基于朱传志的设计文档 最后更新于2014/11/13 关键词:LDAP.认证.权限分配.IdCenter. 本文档适用人员:研发   曾经一个IT内部系统配一套帐号体系和授权   线上生产环境里 ...

  2. SPOJ GSS1 Can you answer these queries I[线段树]

    Description You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A q ...

  3. css之px自动转rem—“懒人”必备

    作为一名前端开发,尤其是在做移动端适配时,rem是我们经常用到的单位,它的好处大家可以自行搜索,网上已经有很多了.但是我们再将设计稿上的px转换成rem时,得手动的去计算,这是一个很耗时.费力的过程, ...

  4. Android notification的使用

    notification出现在通知栏中的提示,特别是在4.0以后改进了不少,这里讲得都是基于4.0及4.1以后的. 分类: 1.普通Notification 2.大布局Notification 图1 ...

  5. 银光类似web visio的节点连线控件Essential Diagram免费下载地址

    Essential Diagram for Silverlight是一款功能强大的图解拓扑图控件,在XAML支持的情况下提供用户交互式地创建和编辑图解,支持数据绑定和多种布局,可以导出为多种文件格式等 ...

  6. 20145215《Java程序设计》第9周学习总结

    20145215<Java程序设计>第九周学习总结 教材学习内容总结 整合数据库 JDBC入门 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操 ...

  7. UVa 10935卡片游戏

    很简单的一个题目,就是队列的运用就可以了,就是注意一下1的时候的情况就可以了. #include<iostream> #include<queue> using namespa ...

  8. linux oracle profile配置

    [oracle@db01 ~]$ more .bash_profile # .bash_profile # Get the aliases and functionsif [ -f ~/.bashrc ...

  9. Redis基础教程

    说明:本文中涉及的代码是c#所写,连接redis的第三方驱动为ServiceStack.Redis.连接redis的客户端软件为redis-desktop-manager. 一.Redis是什么 Re ...

  10. SQLServer—系统中的内存配置

    前言: 本文讲述32位和64位系统中的内存配置,在SQLServer 2005/2008中,DBA们往往尝试开启AWE来限制内存.但是,在SQLServer2012以后,这个选项将被弃用,所以不能使用 ...