热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ3159

POJ3159题目大意:给n个小朋友们分糖果,其中有m个关系abc,代表A允许B比自己最多多C个糖果,求第一个小朋友到第n个

POJ 3159

题目大意:给n个小朋友们分糖果,其中有m个关系a b c,代表A允许B比自己最多多C个糖果,求第一个小朋友到第n个小朋友的糖果数的差最大是多少(满足这m个条件下)

解:题目有隐藏题意,第n个小朋友(即班长要比1多),所以这些条件就是一个差分约束,然后求1到n的最短路即可(dist[x]表示1允许x比自己多多少,把关系传递,显然是一个最短路模型,如果存在一条1到x的路比已知短,显然要更新才能满足题意。),初始化全部为bilibili,dist[1]为0,鬼畜的是即使是spfa+slf+queue也会tle,但是用spfa+stack就会很快(我刷上第四名),300+ms,dij+heap也要500ms。

spfa+stack

1 //poj 3159
2 const
3 maxn=31111;
4 maxm=151111;
5 bilibili=maxlongint >> 1;
6 type
7 data=record
8 cost, dest, next: longint;
9 end;
10 var
11 edge: array[1..maxm]of data;
12 q, vect, dist: array[1..maxn]of longint;
13 visit: array[1..maxn]of boolean;
14 n, m, tot, ans: longint;
15 procedure add(x, y, z: longint);
16 begin
17 inc(tot);
18 with edge[tot] do begin
19 dest := y;
20 cost := z;
21 next := vect[x];
22 vect[x] := tot;
23 end;
24 end;
25
26 procedure init;
27 var
28 i, x, y, z: longint;
29 begin
30 tot := 0; ans := 0;
31 fillchar(vect, sizeof(vect), 0);
32 readln(n, m);
33 for i := 1 to m do begin
34 readln(x, y, z);
35 add(x, y, z);
36 end;
37 end;
38
39 function spfa(source: longint): longint;
40 var
41 i, u, head, tail, key: longint;
42 begin
43 fillchar(dist, sizeof(dist), 0);
44 fillchar(visit, sizeof(visit), 0);
45 tail := 1;
46 q[tail] := source; visit[source] := true;
47 filldword(dist, sizeof(dist)>>2, bilibili);
48 dist[source] := 0;
49 repeat
50 u := q[tail];
51 dec(tail);
52 visit[u] := false;
53 i := vect[u];
54 while i<>0 do
55 with edge[i] do begin
56 if dist[dest]>dist[u]&#43;cost then begin
57 dist[dest] :&#61; dist[u] &#43; cost;
58 if not visit[dest] then begin
59 visit[dest] :&#61; true;
60 inc(tail);
61 q[tail] :&#61; dest;
62 end;
63 end;
64 i :&#61; next;
65 end;
66 until tail<&#61;0;
67 spfa :&#61; dist[n];
68 end;
69
70 procedure main;
71 begin
72 ans :&#61; spfa(1);
73 end;
74
75 procedure print;
76 begin
77 writeln(ans);
78 end;
79
80 begin
81 assign(input,&#39;1.txt&#39;); reset(input);
82 init;
83 main;
84 print;
85 end.

dijkstra&#43;heap

1 //poj 3159
2 const
3 maxn&#61;31111;
4 maxm&#61;151111;
5 bilibili&#61;maxlongint >> 1;
6 type
7 data&#61;record
8 cost, dest, next: longint;
9 end;
10 var
11 edge: array[1..maxm]of data;
12 heap, poss, vect, dist: array[1..maxn]of longint;
13 visit: array[1..maxn]of boolean;
14 hptot, n, m, tot, ans: longint;
15 procedure add(x, y, z: longint);
16 begin
17 inc(tot);
18 with edge[tot] do begin
19 dest :&#61; y;
20 cost :&#61; z;
21 next :&#61; vect[x];
22 vect[x] :&#61; tot;
23 end;
24 end;
25
26 procedure init;
27 var
28 i, x, y, z: longint;
29 begin
30 tot :&#61; 0; ans :&#61; 0;
31 fillchar(vect, sizeof(vect), 0);
32 readln(n, m);
33 for i :&#61; 1 to m do begin
34 readln(x, y, z);
35 add(x, y, z);
36 end;
37 end;
38
39 procedure up(x: longint);
40 var
41 i, tmp: longint;
42 begin
43 i :&#61; x;
44 tmp :&#61; heap[x];
45 while i>1 do begin
46 if dist[tmp]> 1]] then begin
47 heap[i] :&#61; heap[i >> 1];
48 poss[heap[i]] :&#61; i;
49 i :&#61; i >> 1;
50 end
51 else break;
52 end;
53 heap[i] :&#61; tmp;
54 poss[tmp] :&#61; i;
55 end;
56
57 procedure down(X: longint);
58 var
59 i, j, tmp: longint;
60 begin
61 i :&#61; x;
62 tmp :&#61; heap[x];
63 while i <<1 <&#61; hptot do begin
64 j :&#61; i <<1;
65 if (j&#43;1<&#61;hptot)and(dist[heap[j]]>dist[heap[j&#43;1]]) then inc(j);
66 if dist[tmp]>dist[heap[j]] then begin
67 heap[i] :&#61; heap[j];
68 poss[heap[i]] :&#61; i;
69 i :&#61; j;
70 end
71 else break;
72 end;
73 heap[i] :&#61; tmp;
74 poss[tmp] :&#61; i;
75 end;
76
77 function dijkstra(source: longint): longint;
78 var
79 i, u: longint;
80 begin
81 fillchar(poss, sizeof(poss), 0);
82 hptot :&#61; 0; poss[source] :&#61; -1; u :&#61; 1;
83 filldword(dist, sizeof(dist)>>2, bilibili);
84 dist[source] :&#61; 0;
85 repeat
86 if u&#61;n then break;
87 i :&#61; vect[u];
88 while i<>0 do
89 with edge[i] do begin
90 if dist[dest]>dist[u]&#43;cost then begin
91 dist[dest] :&#61; dist[u] &#43; cost;
92 if poss[dest] &#61; 0 then begin
93 inc(hptot);
94 heap[hptot] :&#61; dest; poss[dest] :&#61; hptot;
95 up(hptot);
96 end
97 else up(poss[dest]);
98 end;
99 i :&#61; next;
100 end;
101 u :&#61; heap[1];
102 poss[u] :&#61; -1;
103 heap[1] :&#61; heap[hptot];
104 poss[heap[1]] :&#61; 1;
105 dec(hptot);
106 down(1);
107 until false;
108 dijkstra :&#61; dist[n]-dist[source];
109 end;
110
111 procedure main;
112 begin
113 ans :&#61; dijkstra(1);
114 end;
115
116 procedure print;
117 begin
118 writeln(ans);
119 end;
120
121 begin
122 assign(input,&#39;1.txt&#39;); reset(input);
123 init;
124 main;
125 print;
126 end.




转:https://www.cnblogs.com/wmzisfoolish/archive/2012/04/06/2435196.html



推荐阅读
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
author-avatar
mobiledu2502857923
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有