zoukankan      html  css  js  c++  java
  • 洛谷$P4768 [NOI2018]$归程 $kruscal$重构树

    正解:$kruscal$重构树

    解题报告:

    传送门$QwQ$

    语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$

    所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海拔.有$Q$组询问,每次查询从$x$出发,经过海拔超过$p$的所有路径,能到达的节点中距离1号节点的最短路径长是多少$QwQ$

    首先看到这个对海拔的限制就显然考虑$kruscal$重构树呗$QwQ$,然后说是所有海拔超过$p$的路径能到达的点中最短路最小的点$QwQ$?

    可以理解成把最短路作为一个点的属性,然后问$kruscal$重构树中一棵子树中的属性$min$是多少$QwQ$?

    那不给每个节点记录下子树内的属性$min$然后每次查询就跳下就成$QwQ$?

    然后就做完了鸭$QwQ$

    $overrrrrr$

    然后$attention$,那个$lastans$在每一轮都要清零,,,因为它是说每个第一天$lastans$都等于0$QwQ$

    $over$

     

    #include<bits/stdc++.h>
    using namespace std;
    #define il inline
    #define gc getchar()
    #define mp make_pair
    #define int long long
    #define P pair<int,int>
    #define t(i) edge[i].to
    #define w(i) edge[i].wei
    #define fy(i) edge_krus[i].wei
    #define ri register int
    #define rc register char
    #define rb register bool
    #define rp(i,x,y) for(ri i=x;i<=y;++i)
    #define my(i,x,y) for(ri i=x;i>=y;--i)
    #define e(i,x) for(ri i=head[x];i;i=edge[i].nxt)
    
    const int N=1000000+1000,M=1000000+10;
    int ed_cnt,ed_tr_cnt,head[N],as[N<<1],fat[N<<1][20],nod_cnt,n,m,fa[N<<1],lstas,val[N<<1];
    bool vis[N];
    struct ed{int to,nxt,wei;}edge[M<<1];
    struct ed_tr{int fr,to,wei;}edge_krus[M];
    
    il int read()
    {
        rc ch=gc;ri x=0;rb y=1;
        while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
        if(ch=='-')ch=gc,y=0;
        while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
        return y?x:-x;
    }
    il bool cmp(ed_tr gd,ed_tr gs){return gd.wei>gs.wei;}
    int fd(ri x){return fa[x]==x?x:fa[x]=fd(fa[x]);}
    il void ad(ri x,ri y,ri z){edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;}
    il void dij()
    {
        priority_queue< P,vector<P>,greater<P> >Q;
        memset(vis,0,sizeof(vis));memset(as,63,sizeof(as));as[1]=0;Q.push(mp(0,1));
        while(!Q.empty())
        {
            ri nw=Q.top().second;Q.pop();if(vis[nw])continue;vis[nw]=1;
            e(i,nw)if(as[t(i)]>as[nw]+w(i))as[t(i)]=as[nw]+w(i),Q.push(mp(as[t(i)],t(i)));
        }
    }
    il int jump(ri x,ri y){my(i,19,0)if(val[fat[x][i]]>y)x=fat[x][i];return x;}
    
    signed main()
    {
        freopen("return.in","r",stdin);freopen("return.out","w",stdout);
        ri T=read();
        while(T--)
        {
            n=read();m=read();rp(i,1,n<<1)fa[i]=i;nod_cnt=n;ed_cnt=0;memset(head,0,sizeof(head));lstas=0;
            rp(i,1,m){ri x=read(),y=read(),z=read(),p=read();ad(x,y,z);ad(y,x,z);edge_krus[i]=(ed_tr){x,y,p};}
            dij();sort(edge_krus+1,edge_krus+1+m,cmp);
            //rp(i,1,n)printf("as[%d]=%d
    ",i,as[i]);
            rp(i,1,m)
            {
                ri x=fd(edge_krus[i].fr),y=fd(edge_krus[i].to);if(x==y)continue;
                //printf("x=%d y=%d z=%d fy=%d
    ",edge_krus[i].fr,edge_krus[i].to,edge_krus[i].wei,fy(i));
                fa[x]=fa[y]=fat[x][0]=fat[y][0]=++nod_cnt;as[nod_cnt]=min(as[x],as[y]);val[nod_cnt]=fy(i);
                //printf("val[fa[%d]=fa[%d]=%d]=%d nod_cnt=%d
    ",x,y,fa[x],val[fa[x]],nod_cnt);
            }
            rp(i,1,19)rp(j,1,nod_cnt)fat[j][i]=fat[fat[j][i-1]][i-1];
            ri Q=read(),k=read(),s=read();
            while(Q--)
            {
                ri x=(read()+k*lstas-1)%n+1,y=(read()+k*lstas)%(s+1);printf("%lld
    ",lstas=as[jump(x,y)]);
            }
        }
        return 0;
    }
    View Code

     

  • 相关阅读:
    jquery easyui datebox 时间控件默认显示当前日期的实现方法
    CentOS下Web服务器环境搭建LNMP一键安装包
    EasyUI DateBox 按钮自定义添加功能
    Java程序如何生成Jar、exe及安装文件
    推荐!Sublime Text 最佳插件列表
    Sublime Text插件:HTML+CSS+JAVASCRIPT+JSON快速格式化
    java判断是excel2003还是2007以上
    Content-Type: application/vnd.ms-excel"
    小说大纲
    java判断文件真实类型
  • 原文地址:https://www.cnblogs.com/lqsukida/p/11369482.html
Copyright © 2011-2022 走看看