POJ 1135 Domino Effect (Dijkstra 最短路)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9335 | Accepted: 2325 |
Description
Take a number of dominoes and build a row by standing them on end with only a small distance in between. If you
do it right, you can tip the first domino and cause all others to fall down in succession (this is where the phrase ``domino effect'' comes from).
While this is somewhat pointless with only a few dominoes, some people went to the opposite extreme in the early Eighties. Using millions of dominoes of different colors and materials to fill whole halls with elaborate patterns of falling dominoes, they created
(short-lived) pieces of art. In these constructions, usually not only one but several rows of dominoes were falling at the same time. As you can imagine, timing is an essential factor here.
It is now your task to write a program that, given such a system of rows formed by dominoes, computes when and where the last domino falls. The system consists of several ``key dominoes'' connected by rows of simple dominoes. When a key domino falls, all rows
connected to the domino will also start falling (except for the ones that have already fallen). When the falling rows reach other key dominoes that have not fallen yet, these other key dominoes will fall as well and set off the rows connected to them. Domino
rows may start collapsing at either end. It is even possible that a row is collapsing on both ends, in which case the last domino falling in that row is somewhere between its key dominoes. You can assume that rows fall at a uniform rate.
Input
them. The key dominoes are numbered from 1 to n. There is at most one row between any pair of key dominoes and the domino graph is connected, i.e. there is at least one way to get from a domino to any other domino by following a series of domino rows.
The following m lines each contain three integers a, b, and l, stating that there is a row between key dominoes a and b that takes l seconds to fall down from end to end.
Each system is started by tipping over key domino number 1.
The file ends with an empty system (with n = m = 0), which should not be processed.
Output
decimal point, and the location of the last domino falling, which is either at a key domino or between two key dominoes(in this case, output the two numbers in ascending order). Adhere to the format shown in the output sample. The test data will ensure there
is only one solution. Output a blank line after each system.
Sample Input
2 1
1 2 27
3 3
1 2 5
1 3 5
2 3 5
0 0
Sample Output
System #1
The last domino falls after 27.0 seconds, at key domino 2. System #2
The last domino falls after 7.5 seconds, between key dominoes 2 and 3.
Source
题目链接:http://poj.org/problem?id=1135
题目大意:有n张关键的多米诺骨牌,m条路。从一条路的起点到终点的牌所有倒下须要时间t。计算最后一张倒下的牌在哪。是什么时候
题目分析:两种情况:
1.最后倒下的牌就是某张关键牌,则时间为最短路中的最大值ma1
2.最后倒下的牌在某两张牌之间,则时间为到两张牌的时间加上两张牌之间牌倒下的时间除2的最大值ma2
最后比較m1和m2。若m1大则为第一种情况,否则是另外一种情况
一组例子:
4 4
1 2 5
2 4 6
1 3 5
3 4 7
0 0
答案:
The last domino falls after 11.5 seconds, between key dominoes 3 and 4.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const INF = 0x3fffffff;
int const MAX = 505;
int map[MAX][MAX];
int dis[MAX];
bool used[MAX];
int n, m, ca = 1; void Dijkstra(int v0)
{
memset(used, false, sizeof(used));
for(int i = 1; i <= n; i++)
dis[i] = map[v0][i];
used[v0] = true;
dis[v0] = 0;
for(int i = 0; i < n - 1; i++)
{
int u = 1, mi = INF;
for(int j = 1; j <= n; j++)
{
if(!used[j] && dis[j] < mi)
{
mi = dis[j];
u = j;
}
}
used[u] = true;
for(int k = 1; k <= n; k++)
if(!used[k] && map[u][k] < INF)
dis[k] = min(dis[k], dis[u] + map[u][k]);
}
double ma1 = -1, ma2 = -1;
int pos, pos1, pos2;
for(int i = 1; i <= n; i++)
{
if(dis[i] > ma1)
{
ma1 = dis[i];
pos = i;
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(map[i][j] < INF && (dis[i] + dis[j] + map[i][j]) / 2.0 > ma2)
{
ma2 = (dis[i] + dis[j] + map[i][j]) / 2.0;
pos1 = i;
pos2 = j;
}
}
}
if(ma1 < ma2)
printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n", ma2, pos1, pos2);
else
printf("The last domino falls after %.1f seconds, at key domino %d.\n\n", ma1, pos); } int main()
{
while(scanf("%d %d", &n, &m) != EOF && (n + m))
{
for(int i = 1; i <= n; i++)
{
dis[i] = INF;
for(int j = 1; j <= n; j++)
map[i][j] = INF;
}
for(int i = 0; i < m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
map[u][v] = w;
map[v][u] = w;
}
printf("System #%d\n", ca ++);
Dijkstra(1);
}
}
POJ 1135 Domino Effect (Dijkstra 最短路)的更多相关文章
- POJ 1135 -- Domino Effect(单源最短路径)
POJ 1135 -- Domino Effect(单源最短路径) 题目描述: 你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两 ...
- POJ 1135 Domino Effect(Dijkstra)
点我看题目 题意 : 一个新的多米诺骨牌游戏,就是这个多米诺骨中有许多关键牌,他们之间由一行普通的骨牌相连接,当一张关键牌倒下的时候,连接这个关键牌的每一行都会倒下,当倒下的行到达没有倒下的关键牌时, ...
- POJ 1135.Domino Effect Dijkastra算法
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10325 Accepted: 2560 De ...
- POJ 1135 Domino Effect (spfa + 枚举)- from lanshui_Yang
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- [POJ] 1135 Domino Effect
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12147 Accepted: 3046 Descri ...
- poj 2253 Frogger (dijkstra最短路)
题目链接:http://poj.org/problem?id=2253 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- POJ 2253 Frogger(dijkstra 最短路
POJ 2253 Frogger Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fion ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- POJ. 2253 Frogger (Dijkstra )
POJ. 2253 Frogger (Dijkstra ) 题意分析 首先给出n个点的坐标,其中第一个点的坐标为青蛙1的坐标,第二个点的坐标为青蛙2的坐标.给出的n个点,两两双向互通,求出由1到2可行 ...
随机推荐
- Oracle ORA-12541:TNS:无监听程序
Oracle ORA-12541:TNS:无监听程序 标签: Oracle DataBase 今天使用Oracle数据库,使用可视化连接工具连接测试环境的数据库时提示无监听程序,最后在老师帮助下终于搞 ...
- unmappable character for US-ASCII
编码错误编译时加-encoding UTF-8即可 :javac -encoding UTF- file.java //
- 关于获取Windows下性能参数的总结
Windows下特定进程或者所有进程的CPU.物理内存.虚拟内存等性能参数的获取方法小结,包括如何在MFC中以及如何使用C#语言来获取参数. VC API:GlobalMemoryStatus 获取全 ...
- *CI框架装载器Loader.php源码分析
http://www.bitscn.com/pdb/php/201411/404680.html 顾名思义,装载器就是加载元素的,使用CI时,经常加载的有: $this->load->li ...
- Java编程的逻辑 (35) - 泛型 (上) - 基本概念和原理
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- K8s中,tomcat的一部分jvm参数,如何通过env环境变量传递?
这两天解决的一个需求: 如果用户没有在deployment中设置env参数,则tomcat默认使用1G左右的内存: 如果用户在deployment中提供了jvm参数,则tomcat将这部分的参数,覆盖 ...
- 【LOJ】#2536. 「CQOI2018」解锁屏幕
题解 什么破题,看一眼就能想出来\(n^2 2^n\)看了一眼数据范围有点虚,结果跑得飞快= = 处理出\(a[i][j]\)表示从\(i\)到\(j\)经过的点的点集 然后\(f[i][S]\)表示 ...
- 026 Spark 的官网(版本为1.6.1的总官网)
1. 多多读官网,所有的只知识点都可以从上面的总纲中查到.
- git初级浅入其常用操作
1. git init 我们从初始化一个仓库开始,通过此命令可以初始化一个仓库 git init 首先我们在当前目录下创建一个目录pratice和一个文件test.js mkdir pratice c ...
- RAR压缩包审计工具unrar-nofree
RAR压缩包审计工具unrar-nofree RAR是常见的一种压缩包格式,广泛应用于Windows系统下.Kali Linux提供一款专用的审计工具unrar-nofree.该工具由WinRAR ...