zoukankan      html  css  js  c++  java
  • BZOJ3732 Network

    题目链接:戳我
    kruskal重构树。
    具体可以参考我的简单学习笔记,或者更推荐的attack dalao的学习笔记

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define MAXN 100010
    using namespace std;
    int n,m,k,cnt,t;
    int fa[MAXN],head[MAXN],top[MAXN],dep[MAXN],val[MAXN],siz[MAXN],son[MAXN];
    struct Edge{int u,v,dis;}edge[MAXN<<1];
    struct Edge2{int nxt,to;}e[MAXN<<1];
    inline bool cmp(struct Edge x,struct Edge y){return x.dis<y.dis;}
    inline int find(int x){return fa[x]==x?x:find(fa[x]);}
    inline void add(int from,int to)
    {
        e[++t].nxt=head[from],e[t].to=to,head[from]=t;
        e[++t].nxt=head[to],e[t].to=from,head[to]=t;
    }
    inline void kruskal()
    {
        for(int i=1;i<=m;i++)
        {
            int u=edge[i].u,v=edge[i].v;
            int a=find(u),b=find(v);
            if(a==b) continue;
            fa[a]=fa[b]=fa[++cnt]=cnt;
            val[cnt]=edge[i].dis;
            add(a,cnt),add(b,cnt);
        }
    }
    inline void dfs1(int now,int pre)
    {
        fa[now]=pre;
        dep[now]=dep[pre]+1;
        siz[now]=1;
        int maxx=-1;
        for(int i=head[now];i;i=e[i].nxt)
        {
            int v=e[i].to;
            if(v==pre) continue;
            dfs1(v,now);
            siz[now]+=siz[v];
            if(siz[v]>maxx) maxx=siz[v],son[now]=v;
        }
    }
    inline void dfs2(int x,int topf)
    {
        top[x]=topf;
        if(son[x]) dfs2(son[x],topf);
        for(int i=head[x];i;i=e[i].nxt)
        {
            int v=e[i].to;
            if(v==son[x]||v==fa[x]) continue;
            dfs2(v,v);
        }
    }
    inline int lca(int x,int y)
    {
        while(top[x]!=top[y])
        {
            if(dep[top[x]]<dep[top[y]]) swap(x,y);
            x=fa[top[x]];
        }
        if(dep[x]<dep[y]) return x;
        else return y;
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        scanf("%d%d%d",&n,&m,&k);
        cnt=n;
        for(int i=1;i<=n;i++) fa[i]=i;
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].dis);
        sort(&edge[1],&edge[m+1],cmp);
        kruskal();
        dfs1(cnt,0);
        dfs2(cnt,cnt);
        for(int i=1;i<=k;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            printf("%d
    ",val[lca(u,v)]);
        }
        return 0;
    }
    

    BZOJ50题纪念

  • 相关阅读:
    git 命令
    减少死锁的几个常用方法
    JFinal SQL in 查询排序
    并发编程中,如何减少上下文切换
    MySql批量更新
    百度编辑器上传图片自定义路径,访问路径动态加载
    百度编辑器不能插入html标签解决方法
    搭建贴吧自动签到服务
    mpv设置CPU软解
    使用Vercel+Github搭建个人博客
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10301685.html
Copyright © 2011-2022 走看看