HNU 12847 Dwarf Tower(最短路+队列优化)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12847

解题报告:有n样物品,编号从1到n第i样物品可以通过金币vi买到,同时有m种方法,方法的内容是由两种物品可以构造出另一种物品,现在要你求出得到1物品的价值最小是多少?

当成最短路来解,用邻接表存好m种构造方法,然后用队列里面的点去尝试通过构造的方法使得得到i物品所花的价值更小,如果更新成功,再把更新成功的那个点又加入到队列中。

同时要标记一下这个点是不是正在队列中,如果是的话就不要重复加了。直到队列为空结束。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<deque>
 8 using namespace std;
 9 const int maxn = 10000+5;
10 struct node
11 {
12     int a,b;
13 };
14 int w[maxn],visit[maxn];
15 vector<node> vt[maxn];
16 vector<node>::iterator iter;
17 deque<int> de;
18 int main()
19 {
20     int n,m;
21     while(scanf("%d%d",&n,&m)!=EOF)
22     {
23         de.clear();
24         for(int i = 1;i <= n;++i)
25         vt[i].clear();
26         memset(visit,0,sizeof(visit));
27         for(int i = 1;i <= n;++i)
28         {
29             scanf("%d",&w[i]);
30             de.push_back(i);
31             visit[i] = 1;
32         }
33         int a,b,c;
34         while(m--)
35         {
36             scanf("%d%d%d",&a,&b,&c);
37             node temp = {c,a};
38             vt[b].push_back(temp);
39             temp.a = b;
40             temp.b = a;
41             vt[c].push_back(temp);
42         }
43         while(!de.empty())
44         {
45             int ss = *de.begin();
46             de.pop_front();
47             visit[ss] = 0;
48             iter = vt[ss].begin();
49             for(;iter != vt[ss].end();++iter)
50             if(w[ss] + w[iter->a] < w[iter->b])
51             {
52                 w[iter->b] = w[ss] + w[iter->a];
53                 if(visit[iter->b] == 0)
54                 {
55                     visit[iter->b] = 1;
56                     de.push_back(iter->b);
57                 }
58             }
59         }
60         printf("%d\n",w[1]);
61     }
62     return 0;
63 }

HNU 12847 Dwarf Tower(最短路+队列优化),布布扣,bubuko.com

时间: 2024-12-24 17:21:03

HNU 12847 Dwarf Tower(最短路+队列优化)的相关文章

Codeforces Gym 100269 Dwarf Tower (最短路)

题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game named "Dwarf Tower". In this game there are n different items,which you can put on your dwarf character. Items are numbered from 1 to n. Vasya want

bzoj1233: [Usaco2009Open]干草堆tower 单调队列优化dp

又是一道单调队列优化dp的题目 这道题呢 先要了解一个结论,在多种可行的堆叠方案中,至少有一种能使层数最高的方案同时使得底边最短.即底边最短的,层数一定最高. 这个是zkw大神得出的 我也不会证明来着 反正这样之后我们就可以得出正确的方法了 递推式 F[i]=min(sum[j-1]-sum[i-1])  j>i 且 sum[j-1]-sum[i-1]>=F[j] 易得在满足的条件下j当然是越小越好了嘛 而这样得出的方程又满足一定的单调性 这样调整之后队首就是我们要的答案啦 又对于转移条件 f

USACO 2009 Open 干草塔 Tower of Hay(贪心+单调队列优化DP)

https://ac.nowcoder.com/acm/contest/1072/B Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上运来,共会出现N包干草,第i包干草的宽度是Wi,高度和长度统一为1.干草塔要从底层开始铺建.贝西会选择最先送来的若干包干草,堆在地上作为第一层,然后再把紧接着送来的几包干草包放在第二层,再铺建第三层……重复这个过程,一直到所有的干草全部用完.每层的干草包必须紧靠在一起,不出现缝隙,而且为了建筑稳定,

HDU 2544(floyd+bellman-ford+floyd+dijkstra队列优化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: 1 #include<iostream> 2 #include<functional> 3 #include<vector> 4 #include<queue> 5 using namespace std; 6 typedef pair<int, int>

双参数Bellman-ford带队列优化类似于背包问题的递推

为方便起见,将Bellman-ford队列优化称为SPFA,= = 抓住 ZMF (ZMF.pas/c/cpp) 题目描述 话说这又是一个伸手不见五指的夜晚,为了机房的电子竞技事业永远孜孜不倦的 ZMF 小朋友躲在一个阴暗的角落(毫无疑问又搞起了).当然,另一个神龙见首不见尾的黑影也偷偷地出现在了后门……此时我们敬爱的 MR.LI 开始为如何抓住 ZMF 发愁了:为了捉住 ZMF,经过其他人的座位是不可避免的,其他人也会发出或大或小的响声,而一旦响声之和超过了一定的值,把游戏当成作业的 ZMF

[HNU4]Dwarf Tower

题意:给你n件物品,每个物品买需要一个价值,m个规则 x,y,z  表示 y z 可以构成 x  ,问你最少要多少构成第一个物品, 解题思路:这里用到图论思想,每有一个点更新就把它加入到队列里面等待松弛,但是还是必须要标记 解题代码: 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream>

SPFA(Bellman-Ford队列优化)

原理:队列+松弛操作 将源点加入队尾,每一步读取队头顶点u,并将队头顶点u出队(记得消除标记):将与点u相连的所有点v进行松弛操作,如果能更新距离(即令d[v]变小),那么就更新,另外,如果点v没有在队列中(打个标记),那么要将点v入队,如果已经在队列中了,那么就不用入队 以此循环,直到队空为止就完成了单源最短路的求解 判断有无负环: 如果某个点进入队列的次数超过N次则存在负环 /**********************************************************

最短路径(四)—Bellman-Ford的队列优化(邻接表)

上一节我们写了Bellman-Ford算法解决负权边的问题: 邻接表存储图: n个顶点,m条边. 数组实现邻接表.对每一条边进行1-m编号.用u,v,w三个数组来记录每条边的信息,即u[i],v[i],w[i]表示第i条边是从第 u[i]号顶点到v[i]号顶点且权值为w[i]. first数组的1-n号单元格分别用来存储1-n号顶点的第一条边的编号,初始的时候因为没有边加入所有都是-1.即first[u[i]]保存顶点u[i]的第一条边的编号,next[i]存储"编号为i的边"的&qu

[Vijos 1243]生产产品(单调队列优化Dp)

Description 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器中的任何一台完成,但生产的步骤必须严格按顺序执行.由于这N台机器的性能不同,它们完成每一个步骤的所需时间也不同.机器i完成第j个步骤的时间为T[i,j].把半成品从一台机器上搬到另一台机器上也需要一定的时间K.同时,为了保证安全和产品的质量,每台机器最多只能连续完成产品的L个步骤.也就是说,如果有一台机器连续完