关闭

UVA 11354 Bond(MST+倍增)

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

【题意】给定N<=5*10^4,M<=1*10^5的图,Q<=5*10^4个询问,(u,v)选择一条路径使得最大的边权最小。

【解题方法】找最小,显然先MST。然后用倍增搞一搞就行了,熟练剖分也可以,算是树剖入门题了,我这里用倍增来搞一下。

【AC 代码】

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 5e5+10;
const int maxm = 1e6+10;
int n,m,q;
struct edge1{
    int u,v,w;
    bool operator<(const edge1 &rhs) const{
        return w<rhs.w;
    }
};
vector<edge1>E1;
int head[maxn],tot;
struct edge{
    int v,w,next;
}E[maxm];
void init()
{
    memset(head,-1,sizeof(head));
    tot=0;
}
void addedge(int u,int v,int w)
{
    E[tot].v=v,E[tot].w=w,E[tot].next=head[u],head[u]=tot++;
}
int fa[maxn];
int Find(int x)
{
    if(x==fa[x]) return x;
    else return fa[x]=Find(fa[x]);
}
void Kruskal()
{
    for(int i=1; i<=n; i++) fa[i]=i;
    sort(E1.begin(),E1.end());
    init();
    int num=0;
    for(auto &e:E1)
    {
        int u=Find(e.u),v=Find(e.v);
        if(u==v) continue;
        fa[u]=v;
        addedge(e.u,e.v,e.w);
        addedge(e.v,e.u,e.w);
        ++num;
        if(num==n-1) break;
    }
}
int dep[maxn],p[20][maxn],maxv[20][maxn];
void dfs(int u,int f,int d,int w)
{
    dep[u]=d;
    p[0][u]=f,maxv[0][u]=w;
    for(int i=head[u]; ~i; i=E[i].next)
    {
        int v=E[i].v;
        if(v==f) continue;
        dfs(v,u,d+1,E[i].w);
    }
}
void build()
{
    dfs(1,-1,0,0);
    for(int i=0; i+1<18; i++)
    {
        for(int v=1; v<=n; v++)
        {
            if(p[i][v]<0) p[i+1][v]=-1;
            else p[i+1][v]=p[i][p[i][v]];
            maxv[i+1][v] = max(maxv[i][v],maxv[i][p[i][v]]);
        }
    }
}
int lca(int u,int v)
{
    if(dep[u]>dep[v]) swap(u,v);
    for(int i=0; i<18; i++) if(dep[u]-dep[v]>>i&1) v=p[i][v];
    if(u==v) return u;
    for(int i=17; ~i; i--)
        if(p[i][u]!=p[i][v])
            u=p[i][u],v=p[i][v];
    return p[0][u];
}
int get(int u,int to)
{
    int ret=0;
    for(int i=0; i<18; i++)
        if(dep[u]-dep[to]>>i&1) ret=max(ret,maxv[i][u]),u=p[i][u];
    return ret;
}
int main()
{
    int cas=0;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        E1.clear();
        int u,v,w;
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            E1.push_back(edge1{u,v,w});
        }
        Kruskal();
        build();
        scanf("%d",&q);
        if(cas++) printf("\n");
        while(q--)
        {
            scanf("%d%d",&u,&v);
            int _lca=lca(u,v);
            printf("%d\n",max(get(u,_lca),get(v,_lca)));
        }
    }
    return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

UVA 11354 - Bond(并查集-按秩合并)

题目链接:点击打开链接 题意:给出一张n个点m条边的无向图, 每条边有一个危险度,有q个询问, 每次给出两个点s、t,找一条路, 使得路径上的最大危险度最小。 思路:首先,我们可以发现,如果求一个...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2016-02-15 16:14
  • 2080

UVA 11354 Bond 瓶颈路 最小生成树+LCA类似

题目链接:点击打开链接 题意: 给定n个点m条边的无向图 下面m行是(u,v) 和边权 下面q个询问 (u, v) 在这两个点间找一条路径使得这个路径上最大的边权最小。 数据保证询问的2...
  • qq574857122
  • qq574857122
  • 2014-09-05 13:07
  • 1189

uva 11149(矩阵倍增)

Problem B : Power of Matrix Time limit: 10 seconds Consider an n-by-n matrix ...
  • Wiking__acm
  • Wiking__acm
  • 2013-03-04 19:31
  • 1219

UVA-11354-Bond(树上倍增,dp,MST,LCA)

题目链接:UVA-11354-Bond首先,最大边最小的路径称为最小瓶颈路,最小瓶颈路一定是最小生成树上的路径(根据Kruskal)。 因此先处理处最小生成树,然后将最小生成树转化成一棵有根树。 ...
  • jinglinxiao
  • jinglinxiao
  • 2017-03-28 17:32
  • 178

UVA 11354 Bond (MST + LCA)

求出最小生成树, 然后在最小生成树上求LCA。 Bond Time Limit: 8000MS Memory Limit: Unknown 64bit IO Format:...
  • u011788531
  • u011788531
  • 2015-03-02 22:13
  • 1041

UVA 11354 Bond(最小生成树+lca+倍增求祖先节点)

题意:n个点m条边,每条边有一个权值,有q个询问,每次询问两点间的一条路径,使得这条路径上权值最大的边最小。 思路:很容易想到最小瓶颈路,但是查询太多,会超时,可以预处理出最小生成树,则问题转化为一...
  • u014664226
  • u014664226
  • 2015-08-25 19:12
  • 516

【UVa】11354 Bond 最小生成树,动态LCA,倍增思想

Once again, James Bond is on his way tosaving the world. Bond's latest mission requires him to trave...
  • u013368721
  • u013368721
  • 2014-07-02 20:08
  • 966

最小生成树和倍增法求lca(Uva11354Bond)

Once again, James Bond is on his way to saving the world. Bond’s latest mission requires him to trav...
  • u013672056
  • u013672056
  • 2017-07-27 20:40
  • 104

UVA 11354 Bond(最小生成树+LCA)

给出一个图,边权,然后m次询问:(u,v) 两点之间边权最小的路径上边权最大为多少; 一看就知道是求瓶颈路:给出一种求法,在最小生成数上,两点之间的最长边就为瓶颈路; 先对图生成最小树,然后考虑怎...
  • qq_34542903
  • qq_34542903
  • 2017-02-16 16:09
  • 121

UVA 11354 - Bond (最小生成树 + 树链剖分)

最小生成树 + 树链剖分
  • u011074149
  • u011074149
  • 2014-11-10 19:25
  • 1001
    个人资料
    • 访问:377011次
    • 积分:15879
    • 等级:
    • 排名:第782名
    • 原创:1254篇
    • 转载:13篇
    • 译文:0篇
    • 评论:61条
    文章分类