题目大意:给个无向图,每条边有个限制,每个点最多能买入和卖出一定黄金;然后按顺序走过n个点,求每个卖出黄金的点最多能卖出多少黄金

一开始有点懵,想着怎么再图上做这个问题,后来知道要先建一棵最大生成树

然后就好做了,做的时候黄金全都拿,不必考虑第一个条件,因为就算花不完也能在之前某个地方少买一点黄金

然后没个询问找前后两个点lca,求路径上的最小边的限制,这样就可以求出卖出多少黄金了

最后要谴责一下非常脑残的数据,有个数据点是两条链,dfs时会爆栈= =,WA了我两天十几次

话说出数据时不应该这样戏弄别人,非常浪费时间和精力又没有意义

一定要手写栈!!

 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 #define LL long long
 #define INF 21474836470000
 using namespace std;
 ;
 struct node{
     int from,to,next;
     LL cost;
 }E[maxn*],e[maxn*];
 ],Fa[maxn],dep[maxn],head[maxn],tot,logn,order[maxn],scc[maxn],bel,st[maxn*];
 LL pre[maxn][];

 void insert(int u, int v, LL c){
     e[++tot].to=v; e[tot].next=head[u]; e[tot].cost=c; head[u]=tot;
 }

 bool cmp(node a, node b){
     return a.cost>b.cost;
 }

 int find(int x){
     return Fa[x]==x?x:Fa[x]=find(Fa[x]);
 }

 void dfs(int u, int f){
     ;
     st[++top]=u;
     while (top){
         u=st[top--]; f=fa[u][];
         dep[u]=dep[f]+;
         ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];
         ; i<=logn; i++) pre[u][i]=min(pre[u][i-],pre[fa[u][i-]][i-]);
         for (int i=head[u]; i; i=e[i].next)
             if (e[i].to!=f){
                 fa[e[i].to][]=u;
                 pre[e[i].to][]=e[i].cost;
                 st[++top]=e[i].to;
             }
     }
 }

 LL lca(int u, int v){
     LL ret=INF;
     if (dep[u]<dep[v]) swap(u,v);
     while (dep[u]>dep[v]){
         ; i--)
             if (dep[fa[u][i]]>dep[v]){
                 ret=min(ret,pre[u][i]);
                 u=fa[u][i];
             }
         ret=min(ret,pre[u][]);
         u=fa[u][];
     }
     if (u==v) return ret;
     ; i--)
         if (fa[u][i]!=fa[v][i]){
             ret=min(ret,pre[u][i]);
             ret=min(ret,pre[v][i]);
             u=fa[u][i]; v=fa[v][i];
         }
     ret=min(ret,min(pre[v][],pre[u][]));
     return ret;
 }

 int main(){
     //freopen("motorcycle6.in","r",stdin);
     //freopen("test.out","w",stdout);
     scanf("%d%d%d", &n, &m, &q);
     <<logn)<n) logn++; tot=;
     memset(pre,,sizeof(pre));
     ; i<=n; i++) scanf("%d", &order[i]),Fa[i]=i;//  shunxu
     ; i<=n; i++) scanf("%d", &trade[i]);//  yaoqiu
     ; i<=m; i++) scanf("%d%d%lld", &E[i].from, &E[i].to, &E[i].cost);
     bel=n;
     ,x; i<=q; i++) scanf(,bel=min(bel,x);

     sort(E+,E++m,cmp);
     ; else num=n-q;
     ,hehe=; i<=m; i++){
         int x=E[i].from, y=E[i].to;
         if (scc[x]) x=bel; if (scc[y]) y=bel;
         int fx=find(x), fy=find(y);
         if (fx!=fy){
             Fa[fx]=fy;
             insert(x,y,E[i].cost);
             insert(y,x,E[i].cost);
             hehe++;
             if (hehe==num) break;
         }
     }
     fa[][]=;
     dfs(,);
     LL now=;
     ]]<) puts(]];
     ; i<=n; i++){
         ], y=order[i];
         if (scc[x]) x=bel; if (scc[y]) y=bel;
         now=min(now,lca(x,y));
         x=order[i-]; y=order[i];
         ) now+=(LL)trade[y];
         else{
             ){
                 now+=(LL)trade[y];
                 printf("%d\n", -trade[y]);
             }else{
                 printf("%lld\n", now);
                 now=0LL;
             }
         }
         //printf("%lld\n", now);
     }
     ;
 }

bzoj3322 最大生成树+LCA的更多相关文章

  1. ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)

    https://nanti.jisuanke.com/t/31462 题意 一个N*M的矩形,每个格点到其邻近点的边有其权值,需要构建出一个迷宫,使得构建迷宫的边权之和最小,之后Q次查询,每次给出两点 ...

  2. 最大生成树——LCA

    今天说是要练习LCA结果找了道题看着题解打完了,如此惭愧,Lca还得好好理解啊,感觉在最大生成树上做有点异样,可能还是不是很理解吧,在noip前一定要再把这道题再a一遍,好题啊. 这是2013noip ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca

    大概就是要每两个点 只能有一条路径,并且约束,最短的边用来砌墙,那么反之的意思就是最大的边用来穿过 故最大生成树 生成以后 再用lca计算树上两点间的距离 (当然防止生成树是一条链,可以用树的重心作为 ...

  4. luogu 1967 货车运输(最大生成树+LCA)

    题意:给出一颗n个点的图,q个询问,每次询问u到v的路径中最小的边最大是多少. 图的最大生成树有一个性质,对于该图的任意两个点,在树中他们之间路径的最小边最大. 由于这个图不一定联通,于是我们对它的联 ...

  5. 【NOIP2013】货车运输 最大生成树+LCA

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

  6. [洛谷 P1967] 货车运输 (最大生成树 lca)

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

  7. UVALive - 4960 Sensor network(生成树+LCA)

    题目大意:给出N个点.M条边.问这N个点形成的生成树的最大权值边-最小权值边的最小值 解题思路:先排序,然后按生成树的kruscal算法进行加边,再维护一个最小权值边 加边的时候要考虑一下加下去的边是 ...

  8. P1967 货车运输[生成树+LCA]

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

  9. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

随机推荐

  1. getopt(分析命令行参数)

    ref:http://vopit.blog.51cto.com/2400931/440453   相关函数表头文件         #include<unistd.h>定义函数       ...

  2. CodeForces 429B Working out 动态规划

    Description Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to loo ...

  3. Windows快捷键大全(从XP到win8.1)

    常见用法 F1 显示当前程序或者windows的帮助内容. F2 当你选中一个文件的话,这意味着“重命名” F3 当你在桌面上的时候是打开“查找:所有文件” 对话框 F5 刷新 F10或ALT 激活当 ...

  4. JAVA-面向对象--封装

    1. 如果一个类中没有定义构造函数,会自动加上一个空参的默认构造函数 如果定义了一个构造函数,默认的空参构造函数就没有了. 2. this 当成员变量与局部变量重名的时候,可以使用this来区分.th ...

  5. 对于IE6版本图片透明。

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Nape 获取碰撞点加特效

    package { import nape.phys.Body; import nape.shape.Shape; import nape.shape.Circle; import flash.dis ...

  7. 学习笔记——组合模式Composite

    组合模式,典型的层次结构. 与装饰器类图相似. 区别在于:装饰器模式是为了在接口中增加方法,而组合模式在于层次元素的叠加. ConcreteComponent就是中间结点,可以包含更多的Concret ...

  8. Bootstrap学习 - JavaScript插件

     模态框 <div class="modal" id="myModal" tabindex="-1" role="dialo ...

  9. mysql数据库主从备份

    近期实验室总是不给通知的就停电,导致我们在不停的恢复服务.在某一个断电的过程中,发现我们的项目管理工具redmine的硬盘挂掉了..因为是部署在虚拟机上的,也没做冗余,数据就丢了..于是反思,我们的m ...

  10. HDU 2672 god is a girl

    先找规律,发现是斐波那契数列...然后..水题.. #include<cstdio> #include<cstring> #include<cmath> #incl ...