bzoj3322 最大生成树+LCA
题目大意:给个无向图,每条边有个限制,每个点最多能买入和卖出一定黄金;然后按顺序走过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的更多相关文章
- ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)
		
https://nanti.jisuanke.com/t/31462 题意 一个N*M的矩形,每个格点到其邻近点的边有其权值,需要构建出一个迷宫,使得构建迷宫的边权之和最小,之后Q次查询,每次给出两点 ...
 - 最大生成树——LCA
		
今天说是要练习LCA结果找了道题看着题解打完了,如此惭愧,Lca还得好好理解啊,感觉在最大生成树上做有点异样,可能还是不是很理解吧,在noip前一定要再把这道题再a一遍,好题啊. 这是2013noip ...
 - ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca
		
大概就是要每两个点 只能有一条路径,并且约束,最短的边用来砌墙,那么反之的意思就是最大的边用来穿过 故最大生成树 生成以后 再用lca计算树上两点间的距离 (当然防止生成树是一条链,可以用树的重心作为 ...
 - luogu 1967 货车运输(最大生成树+LCA)
		
题意:给出一颗n个点的图,q个询问,每次询问u到v的路径中最小的边最大是多少. 图的最大生成树有一个性质,对于该图的任意两个点,在树中他们之间路径的最小边最大. 由于这个图不一定联通,于是我们对它的联 ...
 - 【NOIP2013】货车运输 最大生成树+LCA
		
题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...
 - [洛谷 P1967] 货车运输 (最大生成树 lca)
		
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
 - UVALive - 4960 Sensor network(生成树+LCA)
		
题目大意:给出N个点.M条边.问这N个点形成的生成树的最大权值边-最小权值边的最小值 解题思路:先排序,然后按生成树的kruscal算法进行加边,再维护一个最小权值边 加边的时候要考虑一下加下去的边是 ...
 - P1967 货车运输[生成树+LCA]
		
题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q* 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...
 - ACM-ICPC 2018 徐州赛区网络预赛  J. Maze Designer (最大生成树+LCA求节点距离)
		
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
 
随机推荐
- Row_Number实现分页
			
1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号的集合 2:再查询该集合的 第 1 ...
 - 5.1 timestamp数据类型默认值
			
5.1 不支持同一张表中有多个tmiestamp类型字段的默认值为current_time, 5.6版本无此问题
 - CodeForces 510B	 DFS水题
			
题目大意:在图中找到一个字符可以围成一个环(至少有环四个相同元素) 题目思路:对当前点进行搜索,如果发现可以达到某个已经被查找过的点,且当前点不是由这个点而来,则查找成功. #include<c ...
 - HDU 2018 undefined
			
题目思路:完全背包,dp[i][j]代表,砍j只怪,用i点疲劳最多能获得的经验值. 和平常的完全背包不一样的是多了一个限制条件:最多只砍S只怪,所以我们应该多一重循环来q:for 1->S,代表 ...
 - 用python计算md5,sha1,crc32
			
Linux下计算md5sum,sha1sum,crc: 命令 输出 $md5sum hello f19dd746bc6ab0f0155808c388be8ff0 hello $sha1sum hel ...
 - javascript语句语义大全(1)
			
1. <script></script> javascript标签对,所有javascript内容都会写在这个里面 2. var a=0; var a; 变量的声明,上面的是声 ...
 - mysql HA-keepalived
			
关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储,但是它们各有优缺点.heartbeat.drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对 ...
 - STL笔记之【map之添加元素】
			
//---------------------------------------------------------// 向map中插入元素的方法比较//---------------------- ...
 - [转载] ASP.NET MVC4使用百度UEDITOR编辑器
			
前言 配置.net mvc4项目使用ueditor编辑器,在配置过程中遇见了好几个问题,以此来记录解决办法.编辑器可以到http://ueditor.baidu.com/website/downloa ...
 - springframwork历史版本下载地址
			
http://sourceforge.net/projects/springframework/files/springframework-2/