货车运输-lca

14人阅读 评论(0) 收藏 举报
分类:

LCA入门题————————————————————————————————————————————-

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,q,hd[10005],cnt,fa[10005],dep[10005],ru[10005],rt;
int xa,ya,f[10005][20],w[10005][20];
struct nod{
    int x,y,z;
}a[10005];//
struct Edge{
    int to,nxt,w;
}eg[20005];
bool cmp(nod p,nod q)
{
    return p.z>q.z;
}
int find(int x)
{
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}
void add(int x,int y,int z)
{
    cnt++;
    eg[x].to=y;
    eg[x].w=z;
    eg[x].nxt=hd[x];
    hd[x]=cnt;
}
void krus()
{
    for(int i=1;i<=n;i++)
        fa[i]=i;
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int u=find(a[i].x);
        int v=find(a[i].y);
        if(u!=v)
        {
            fa[v]=u;ru[v]++; 
            //重新建图
            add(a[i].x,a[i].y,a[i].z);
            add(a[i].y,a[i].x,a[i].z);
        }
        if(cnt==n-1) break;//最大生成树建立成功 
    }
}
void dfs(int u,int d)
{
    dep[u]=d;
    for(int i=hd[u];i;i=eg[i].nxt)
    {
        int v=eg[i].to;
        if(v!=f[u][0])//儿子不是自己的父亲
        {
            f[v][0]=u;
            w[v][0]=eg[i].w;
            dfs(v,d+1); 
        } 
    }
}
int lca(int x,int y)
{
    if(dep[x]<dep[y])swap(x,y);
    int s=0x3f3f3f3f;
    for(int i=20;i>=0;i--)
    {
        if(dep[x]>dep[y])
        {
            s=min(s,w[x][i]);
            x=f[x][i];
        }
    }
    if(x==y) return s;
    for(int i=20;i>=0;i++)
        if(f[x][i]!=f[y][i])
        {
            s=min(s,min(w[x][i],w[y][i]));
            x=f[x][i];
            y=f[y][i];
        }
    s=min(s,min(w[x][0],w[y][0]));
    return s;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a[i].x,&a[i].y,&a[i].z);
    }
    krus();//建立一棵树,最大生成树 
    for(int i=1;i<=n;i++){
        if(ru[i]==0) {
            rt=i;break;
        }
    }
    dfs(rt,0); 
    for(int i=1;i<=n;i++)
        for(int j=1;j<=20;j++)
        {
            f[i][j]=f[f[i][j-1]][j-1];//i向上跳j步=i,f[i][j]向上跳j-1步
            w[i][j]=min(w[i][j-1],w[f[i][j-1]][j-1]);    
        } 
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d",&xa,&ya);
        if(find(xa)!=find(ya))
            printf("%d\n",-1);
        else
            printf("%d\n",lca(xa,ya));
    }        
}
查看评论

P1967 货车运输(Tarjan做法)

传送门 这个问题叫做『最大瓶颈路径』 最大瓶颈路径一定存在于最大生成树中/反证法:如果最大瓶颈路径不存在与最大生成树中。 这些不在最大生成树中的边会和最大生成树形成环。 我们删掉环上最小的边...
  • qq_35914587
  • qq_35914587
  • 2017-10-17 15:17:21
  • 136

NOIP 2013 货车运输(最大生成树+倍增LCA/Tarjan)

评测传送最大生成树+LCA(倍增或Tarjan)我的Tarjan TLE了 倍增可以过,而且很快。倍增#include #include #include #include #include #in...
  • qq_36820605
  • qq_36820605
  • 2017-10-18 14:31:17
  • 130

Codevs 3287 货车运输 == 洛谷P1967

3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s    空间限制: 128000 KB    题目等级 : 钻石 Diamond 题目描述 Des...
  • qq_35776409
  • qq_35776409
  • 2017-03-17 16:20:02
  • 170

NOIP2013 货车运输(最大生成树+LCA)

模拟考试的时候暴搜,结果写丑了,分都不分 下来啃了一下题解,发现要用到一个叫做倍增的东西,还没有学过。但是老师说的,没有那个东西,写暴力也有30~40分。。。 我觉得最大生成树还是很好理解的,因为...
  • cqbzwja
  • cqbzwja
  • 2015-08-11 21:28:58
  • 3017

2013年noip第三题货车运输truck(树链剖分LCA+最大生成树)

写这个题的时候,其实已经手撸出LCA——tarjan算法, 下面给出一段我的LCA——tarjan模板,说真的真的很好写不能更好写了,大家可以看看别的tarjan算法再来看我的实现,个人觉得写的还不错...
  • accept_
  • accept_
  • 2016-07-07 16:32:02
  • 655

NOIP2013 货车运输 解题报告(最大生成树+倍增lca)

在线评测: http://codevs.cn/problem/3287/ 整体思路: 我们先看一下题,题中需要使道路上的边的最小值尽可能的大,而且并不关心距离之类的东西,保证尽可能的联通即可,所...
  • qq_35772697
  • qq_35772697
  • 2016-10-01 11:00:13
  • 391

货车运输 洛谷1967 最大生成树 lca c++

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

【noip】【lca】火车运输 倍增

这几天把13年的提高做了,最后两道题参考了网上许多代码,最后终于改出来了,这里是day1最后一题。 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路...
  • u011327397
  • u011327397
  • 2016-07-13 08:45:14
  • 882

NOIP2013货车运输 题解

题目描述  A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。  现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下...
  • zzx2015
  • zzx2015
  • 2015-08-11 17:59:09
  • 3103

【NOIP2013】 货车运输

3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 De...
  • Loi_Shirley
  • Loi_Shirley
  • 2016-08-17 23:53:17
  • 671
    个人资料
    持之以恒
    等级:
    访问量: 1118
    积分: 156
    排名: 110万+
    文章存档