Toll! Revisited 大致题意:有两种节点,一种是大写字母,一种是小写字母. 首先输入m条边.当经过小写字母时须要付一单位的过路费.当经过大写字母时,要付当前財务的1/20做过路费. 问在起点最少须要带多少物品使到达终点时还有k个物品. 当有多条符合条件的路径时输出字典序最小的一个. 思路:已知终点的权值,那么能够从终点向前推. 求终点到起点的最短路径,然后按字典序打印路径. 比較难处理的是:向前推时前驱节点的权值计算.列个方程算算就能够了,主要时不能整除的情况. 计算前驱结点dis值…
从终点逆推,d[u]表示进入u以后剩下的货物,那么进入u之前的货物数量设为y,d[u] = x,那么y-x=ceil(y/20.0)=(y-1)/20+1=(y+19)/20. (y-x)*20+r=y+19,0≤r≤19,即19*y=20*x+r,根据题意y应该尽量小,x的部分是不能变动的,所以y=x+ceil(x/19.0). 然后从起点找一条字典序最小的路径即可,因为每个字母都是独一无二的,所以不必bfs,每次记录一个点就够了. #include<bits/stdc++.h> using…
UVA 10537 - The Toll! Revisited option=com_onlinejudge&Itemid=8&page=show_problem&category=550&problem=1478&mosmsg=Submission+received+with+ID+14135315" target="_blank" style="">题目链接 题意:给定一个无向图,大写字母是城市,小写字母是…
传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /************************************************************** Problem: User: youmi Language: C++ Result: Accepted Time: Memory: *****************************************************…
再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个是之前就定义了图的大小了,再下面使用的时候就不用对图的大小进行申请了, 但是因为是直接申请了大小 要对图进行初始化,因此可能在某些题目中这样使用的话会超时 (2)vector< vector<Node> > G; 这个是未定义大小,但是在使用之前要对其的大小内存进行申请. G.resi…
difkstra + 路径输出 The Toll! Revisited Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description Problem G Toll! Revisited Input: Standard Input Output: Standard Output Time Limit: 1 Second Sindbad…
因为spfa没事就被卡一卡,所以堆优化dijstra就显得很重要,在最短路或者其模型里边,最少有一条边是没有被更新过的,也就是它是最短的,同理从这个点开始也有一条边最短,所以每次就找最短的然后松弛操作就可以的. #include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include&…
既然要学习算法,就要学习到它的精髓,才能够使用起来得心应手. 我还是远远不够啊. 早就知道,dijkstra 算法可以用优先队列优化,我却一直不知道该怎样优化.当时,我的思路是这样的:假设有n个顶点,将这n个顶点的id和距原点的距离放在结构体内,再将这n个结构体放入优先队列中,堆顶是距源点距离最小的点.每次要更新距离时,仅仅只需要取堆顶的数就可以了.然而,具体要怎样更新堆内各点的距离呢?将堆顶取出,更新后再放回去?这样的话堆顶永远都会是同一个元素了,因为堆顶元素在更新后,还是距离最小的.那么我们…
题意:两遍最短路 链接:点我 注意结果用long long #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 #define pb(a) push_…
不写普通模板了,还是需要优先队列优化的昂 #include<stdio.h> //基本需要的头文件 #include<string.h> #include<queue> #include<algorithm> #include<vector> using namespace std; typedef pair<int,int> pii; const int INF=0x3f3f3f3f; ; ; ],val[maxm<<]…
K - Watermelon Full of Water Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3632 Appoint description:   Description Watermelon is very popular in the hot summer. Students in ZJU-ICPC Team also lo…
UVA.136 Ugly Numbers (优先队列) 题意分析 如果一个数字是2,3,5的倍数,那么他就叫做丑数,规定1也是丑数,现在求解第1500个丑数是多少. 既然某数字2,3,5倍均是丑数,且1为丑数,那么不妨从1开始算起.算完之后2,3,5均为丑数,然后再从2算起,4,5,10均为丑数--直到算到第1500个即可.那么有如下的问题: 如何从算出来的丑数中取出最小的? 如何保证没有计算重复的丑数? 对于第一个问题,可以采用优先队列的方法,即有序的队列,且为升序,每次只需要取出队首元素即可…
题意: n个点,m条边,问从1走到n的最短路,其中有K次机会可以让一条路的权值变成0.1≤N≤10000;1≤M≤500000;1≤K≤20 题解: 拆点,一个点拆成K个,分别表示到了这个点时还有多少次机会.(x,k)-->(y,k-1),cost=0 或 (x,k)-->(y,k),cost=a[i].d;这题数据比较大, 需要很多优化.(应该只是蒟蒻我才需要这么多优化..)1.不用spfa(时间复杂度不稳定),用dijkstra+优先队列优化2.拆点不拆边.g[i]表示i这个点是由谁拆分出…
Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 16178   Accepted: 5262 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They wan…
畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 50537    Accepted Submission(s): 18852 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走…
Dijkstra算法只能求取边的权重为非负的图的最短路径,而Bellman-Ford算法可以求取边的权重为负的图的最短路径(但Bellman-Ford算法在图中存在负环的情况下,最短路径是不存在的(负无穷)). 算法原理 Dijkstra算法本质上是一种贪心算法,1959年,Edsger Dijkstra提出了该算法用于解决单源最短路径问题,即在给定每条边的长度\(\mathcal{l}\),求取源节点s到其它所有节点的最短路径.Dijkstra算法维护一个节点集合S,S中的节点到源点的最短距离…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意: 给定一张有向图,可以阻碍若干条有向边,花费为边的权值,求使其最短路变得更长所需的最小花费. 解题思路: 1.因为最短路可能是多条,所以找出最短路网络,然后在最短路网络中跑最小割,即最大流.就切断了原先的最短路且保证了是最小花费(最小割). 2.值得注意的地方:边的长度限制为1e9,所以最短路数组…
github地址:https://github.com/muzhailong/dijkstra-PriorityQueue 1.题目 分析与解题思路 dijkstra算法是典型的用来解决单源最短路径的算法,该算法采用贪心的思想,广度优先搜索的策略,每一轮从当前节点找对与其邻接的所有节点进行放松操作(比较距离源点的距离,来决定是否执行),记录当前节点为已访问,之后从所有未访问过的节点中找到距离源点最近的节点作为当前节点,重复上述操作.BFS策略体现在每次从当前节点,访问所有与其邻接的节点:贪心的思…
描述 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在.但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助. 山用一个三角形表示,从山顶依次向下有1段.2段.3段等山路,每一段用一个数字T(1<=T<=100)表示,代表晴天小猪在这一段山路上需要爬的时间,每一次它都可以朝左.右.左上.右上四个方向走.山是环形的.(注意:在任意一层的第一段也可以走到本层的最后一段或上一层的最后一段). 晴天小猪从山的左下…
前者之所以叫加强版,就是把uva1027改编了,附加上打印路径罢了. 03年的final题哦!!虽然是水题,但不是我这个只会做图论题的跛子能轻易尝试的——因为有个数学坑. 题意:运送x个货物从a->b,沿途要上交过路费,village(小写字母)只需交一个单位的货物,town(大写字母)要交(x/20+((x%20==0)?0:1))个单位的货物,即每20个货物要上交一个,不足的按20处理.现在已知要送到b点y个货物,那么最少从x出发要携带多少个货物. 注意: 1.路过town:19=20-1,…
题意:给一个无向图,要从起点s运送一批货物到达终点e,每个点代表城镇/乡村,经过城镇需要留下(num+19)/20的货物,而经过乡村只需要1货物即可.现在如果要让p货物到达e,那么从起点出发最少要准备多少货物?输出答案和路径(多条路径则必须输出字典序最小的).注:终点需要花费,而起点不需要. 思路:这最短路变形的不错.要逆推过来求最短路径,那么就从e出发到s的距离!只是p比较大,而且城镇还得推出前一站到底需要多少货物,既然直接计算那么麻烦,也可以一直p++直到能留下p为止就推出来了:而乡村就容易…
题目来源:蓝皮书P331 ·这道题使得我们更加深刻的去理解Dijkstra!       在做惯了if(dis[u]+w<dis[v])的普通最短路后,这道选择路径方案不是简单的比大小的题横在了我们的面前. ·英文题,述大意:      一个无向图,读入起点终点以及各条边的两个端点.读入load,要求从起点开始运输,能够向终点运送load个物品.节点分为两种:城镇节点会每20个单位的货物收取一个单位的货物作为过路费(注意23个货物会收2个单位的物品作为过路费),乡村节点无论你带多少都只收取1个单…
题意:给定一个图,你要从 s 到达 t,当经过大写字母时,要交 ceil(x /20)的税,如果经过小写字母,那么交 1的税,问你到达 t 后还剩下 c 的,那么最少要带多少,并输出一个解,如果多个解,则输出字典序最小的. 析:最短路,逆推,d[i] 表示的是从 i 到时 t 最少要带多少,然后就能顺利的推出从 s 开始时要带多少,然后打印路径,每次取最小的字母即可. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000"…
给定图G=(V,E)G=(V,E),VV中有两类点,一类点(AA类)在进入时要缴纳1的费用,另一类点(BB类)在进入时要缴纳当前携带金额的1/20(不足20的部分按20算) 已知起点为SS,终点为TT,希望在到达TT时能够拥有PP的金额,问一开始在SS最少要携带多少金额,并求出路径(若有多条,输出字典序最小的) 从SS离开时不需要缴费,进入TT时需要缴费 倒序找最短路  d[i] 表示从i到终点需要的最少的金额 在更新d的时候 分两种情况 #include <map> #include <…
一般的dijkstra算法利用贪心的思想,每次找出最短边,然后优化到其他点的的距离,我们还采用贪心思路,但在寻找最短边进行优化,之前是双重for循环,现在我们用优先队列来实现. 代码解释: //样例程序采用边表储存. #include<cstdio>#include<queue>#include<cstring>#include<cmath>#include<iostream> using namespace std; int head[1000…
题目链接:uva 1422 - Processor 题目大意:有一个机器要处理一些问题,给出这些问题可以开始的时间和必须完成的时间,以及任务的工作量,问说机器必须以最少每秒多少得工作量才能完成这些任务. 解题思路:二分答案,答案的上限是MaxWork * MaxN(全在一秒内完成).然后就是判断说在c的工作量小是否能完成任务.因为处理一个问题的时间可以不连续,所以给解题增加了难度. 现将任务按照开始的时间从小到大排序,然后枚举时间区间.开始时间比当前枚举时间小的话入队. 队列用优先队列,结束时间…
Magina Problem Description Magina, also known as Anti-Mage, is a very cool hero in DotA (Defense of the Ancient).If you have no idea of him, here is some brief introduction of his legendary antecedents:Twin sons to the great Prophet, Terrorblade and…
最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查找边,可以用优先队列来优化查找速度,两者结合可以提高很高的效率. 写这篇博客是为了给自己提供一个模板, 在自己研究这问题的时候发生了很多, 有一些小细节的错误错的我怀疑人生, 其实还是自己太菜了,包括函数的重载也不懂, 就琢磨了好久 题目链接:http://acm.hdu.edu.cn/showpr…
2017-09-12 19:50:58 writer:pprp 最近刚开始接触拓扑排序,拓扑排序适用于:无圈图的顶点的一种排序, 用来解决有优先级别的排序问题,比如课程先修后修,排名等. 主要实现:用矩阵来储存图,用indegree数组记录每个顶点的入度, 从入度为0的开始,每次删除该入度为0的点,然后修改其他顶点的入度, 在进行查找入度为0的顶点,循环下去就可以 题意如下:给你n个队伍,m个优先顺序,让你输出总的排名的优先顺序. 代码如下: /* @theme:拓扑排序 hdu 1285 @w…
問題文N を 1 以上の整数とします. 長さ 3N の数列 a=(a1,a2,…,a3N) があります. すぬけ君は.a からちょうど N 個の要素を取り除き.残った 2N 個の要素を元の順序で並べ.長さ 2N の数列 a' を作ろうとしています. このとき.a' のスコアを (a'の前半N要素の総和)−(a'の後半N要素の総和) と定義します. a' のスコアの最大値を求めてください. 制約1≤N≤105ai は整数である.1≤ai≤109部分点300 点分のテストケースでは.N≤1,000…