首页 > 其他分享 >【2021ICPC上海站】H-Life is a Game(kruskal重构树)

【2021ICPC上海站】H-Life is a Game(kruskal重构树)

时间:2022-09-07 21:13:42浏览次数:66  
标签:上海站 Life val int kruskal cnt fa 权值 边权

题意

你本身有一个权值。
每个点有一个权值,到达一个点可以获得这个权值;
每条边也有一个权值,只有你自己当前权值大于等于边权才可以走这条边。

q次询问,每次给出初始点和初始边权,输出可获得的最大边权。

思路

krustal重构树
一个点可以获得自己子树所有点权之和。
子树求和 + 倍增跳就好了

代码

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>  
#define int long long
const int N=2e5+10;
vector<tuple<int,int,int> >es;
vector<int> g[N];
int be,k;
int n,m,q;
int fa[N];
int f[N][21],sz[N];
int val[N],cnt;
int find(int x){
    if(fa[x]!=x) fa[x]=find(fa[x]);
    return fa[x];
}
void krus(){
    cnt=n;//---------
    for(int i=1;i<=n;i++) fa[i]=i;
    sort(es.begin(),es.end());
     int u,v,w;
    for(int i=0;i<m;i++){
        tie(w,u,v)=es[i]; 
        u=find(u),v=find(v);
        if(u!=v){
            val[++cnt]=w;
            fa[cnt]=fa[u]=fa[v]=cnt;
            g[u].push_back(cnt);
            g[cnt].push_back(u);
            g[v].push_back(cnt);
            g[cnt].push_back(v);
        }
    }

}
void dfs(int u,int father){
    f[u][0]=father;
    for(int i=1;i<=20;i++){
        f[u][i]=f[f[u][i-1]][i-1];
    }
    for(int v: g[u]) {
        if(v!=father){
            dfs(v,u);
            sz[u]+=sz[v];
        }
    }
}

void solve(){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++) cin >> sz[i];
    for(int i=0;i<m;i++){
        int u,v,w;
        cin>>u>>v>>w;
      es.emplace_back(w,u,v);
    }
    krus();
    dfs(cnt,0);
    val[0]=1e18+7;
    while(q--){
        cin>>be>>k;
         int ans=k+sz[be];
         while(be!=cnt){
            int x=be;
            for(int i=20;i>=0;i--){
                if(val[f[be][i]]<=ans)
                      be=f[be][i];
            }
            if(x==be) break;
            ans=sz[be]+k;
         }
         cout<<ans<<endl;
    }
}
   
signed main(){
     ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    while(t--) solve();
    return 0;
}

标签:上海站,Life,val,int,kruskal,cnt,fa,权值,边权
From: https://www.cnblogs.com/kingwz/p/16667263.html

相关文章

  • K 线路规划 给定过量边倍增思想删去无用边 kruskal 倍增
    链接:https://ac.nowcoder.com/acm/contest/27836/K来源:牛客网题目描述Q国的监察院是一个神秘的组织。这个组织掌握了整个帝国的地下力量,监察着......
  • 强大的Mac漫画制作软件Comic Life 3
    ComicLife3一款强大的Mac漫画制作软件,它扩展了你可以用你的数码照片做什么。随着页面和面板的布局,精简的图像选择,裁剪和真实的语音气球,可定制的标题,和特殊效果字母的位......
  • 克鲁斯卡尔(Kruskal)算法
    1.应用场景-公交站问题1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通2)各个站点的距离用边线表示(权),比如A–B距离12公里3)问:如何修路保......
  • kruskal
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10,M=2e5+10,INF=0x3f3f3f3f;intn,m,f[N];structedge{intf,t,l;edge(){......
  • L7U2-Hopes and dreams - Discussing life choices
    2022.08.28Sunday16:40-17:30Inthislessonyouwilllearnphrasesandgrammarstructurestoexpressyourhopesandthoughtsaboutfuture.Bytheendofthis......
  • Kruskal 重构树
    Kruskal重构树(没有查阅任何资料,没有任何提前准备,想到哪里写到哪里,代码也是现写的)是一棵二叉树,一张\(N\)个点的无向连通图的Kruskal重构树有\(2N-1\)个节点。叶子......
  • Kruskal和Prim算法详解
    最小生成树概念(转载)假设一个国家有一些城市,这些城市可以互相连接起来,假设每两个城市之间的道路有很多条,那么一定存在这样的情况,可以用最少的路程连接各个城市。......
  • 1041 [SCOI2005]繁忙的都市 kruskal 最小生成树
     链接:https://ac.nowcoder.com/acm/contest/26077/1041来源:牛客网题目描述城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决......
  • 最小生成树Kruskal+Prim算法
    最小生成树给定一张边带权的无向图G=(V,E),n=|V|,m=|E|。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树。边的权值之和最小的生成树被称为无向图G的最......
  • 1036 [SCOI2012]滑雪与时间胶囊 最小生成树 可以用prim做的DAG prim+kruskal不能做DAG
    链接:https://ac.nowcoder.com/acm/contest/26077/1036来源:牛客网题目描述a180285非常喜欢滑雪。他来到一座雪山,这里分布着M条供滑行的轨道和......