POJ 1135 -- Domino Effect(单源最短路径)
POJ 1135 -- Domino Effect(单源最短路径)
题目描述:
你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两张骨牌之间只有很短的空隙。如果排列得很好,当你推 倒第 1张骨牌,会使其他骨牌连续地倒下(这就是短语“多米诺效应”的由来)。 然而当骨牌数量很少时,这种玩法就没多大意思了,所以一些人在 80 年代早期开创了另一个 极端的多米诺骨牌游戏:用上百万张不同颜色、不同材料的骨牌拼成一幅复杂的图案。他们开创 了一种流行的艺术。在这种骨牌游戏中,通常有多行骨牌同时倒下。 你的任务是编写程序,给定这样的多米诺骨牌游戏,计算后倒下的是哪一张骨牌、在什么 时间倒下。这些多米诺骨牌游戏包含一些“关键牌”,他们之间由一行普通骨牌连接。当一张关键 牌倒下时,连接这张关键牌的所有行都开始倒下。当倒下的行到达其他还没倒下的关键骨牌时, 则这些关键骨牌也开始倒下,同样也使得连接到它的所有行开始倒下。每一行骨牌可以从两个端 点中的任何一张关键牌开始倒下,甚至两个端点的关键牌都可以分别倒下,在这种情形下,该行 后倒下的骨牌为中间的某张骨牌。假定骨牌倒下的速度一致。
输入描述:
输入文件包含多个测试数据,每个测试数据描述了一个多米诺骨牌游戏。每个测试数据的第 1行为两个整数:n和m,n表示关键牌的数目,1≤n<500;m表示这 n张牌之间用 m行普通骨 牌连接。n 张关键牌的编号为 1~n。每两张关键牌之间至多有一行普通牌,并且多米诺骨牌图案 是连通的,也就是说从一张骨牌可以通过一系列的行连接到其他每张骨牌。 接下来有 m行,每行为 3个整数:a、b和t,表示第 a张关键牌和第 b张关键牌之间有一行 普通牌连接,这一行从一端倒向另一端需要 t 秒。每个多米诺骨牌游戏都是从推倒第 1 张关键牌 开始的。 输入文件后一行为 n = m = 0,表示输入结束。
输出描述:
对输入文件中的每个测试数据,首先输出一行"System #k",其中 k为测试数据的序号;然后 再输出一行,首先是后一块骨牌倒下的时间,精确到小数点后一位有效数字,然后是后倒下 骨牌的位置,这张后倒下的骨牌要么是关键牌,要么是两张关键牌之间的某张普通牌。输出格 式如样例输出所示。如果存在多个解,则输出任意一个。每个测试数据的输出之后输出一个空行。
解题思路:
最后倒下的牌有两种情形
1.最后倒下的是关键牌,其时间及位置就是第1张关键牌到其他关键牌中最短路径的最大值及对应的关键牌
2.最后倒下的是两张关键牌之间的普通牌,其时间为两张关键牌倒下的时间的一半加上这一行倒下的时间的一半,位置为这两张牌中间的某张牌,不一定是正中间那张,但不用求出具体是哪一张牌。
#include<iostream>
#include<cstring>
using namespace std;
#define MAXN 500
#define INF 1000000
int n,m;///n为关键牌的数量,m为关键牌之间的行数
int Edge[MAXN][MAXN];//邻接矩阵
int time[MAXN];//第i张关键牌倒下的时间(最先推倒_(:зゝ∠)_第0张骨牌,存储时序号已减一)
int S[MAXN];//表示第i张骨牌是否倒下
int Count = ;
void solve_case(int v0)//v0为起始点
{///使用Dijkstra
//首先初始化,将v0加入到顶点集合S
for(int i=;i<n;i++){
time[i] = Edge[v0][i];S[i] = ;
}
S[v0] = ;time[v0] = ;
//计算最短路径
for(int i=;i<n-;i++)//从顶点0确定n-1条最短路径
{
int min = INF,u=;
for(int j=;j<n;j++)//从time[]找出最短的一条边
{
if(!S[j] && time[j]<min){
min = time[j];u = j;
}
}
S[u] = ;///将u加入到S中
for(int j=;j<n;j++)///更新与u相连通的点
{
if(!S[j] && Edge[j][u]!=INF && time[u]+Edge[j][u]<time[j])
{
time[j] = time[u]+Edge[j][u];
}
}
} //1.最后倒下的是关键牌,其时间及位置就是第1张关键牌到其他关键牌中最短路径的最大值及对应的关键牌
double time1 = -INF;int pos;
for(int i=;i<n;i++)
{
if(time[i]>time1) {
time1 = time[i];pos = i;
}
}
//2.最后倒下的是两张关键牌之间的普通牌,其时间为两张关键牌倒下的时间的一半加上这一行倒下的时间的一半,
double time2 = -INF,t;int pos1,pos2;
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
t = (time[i]+time[j]+Edge[i][j])/2.0;
if(Edge[i][j]<INF && t>time2){
time2 = t;pos1 = i;pos2 = j;
}
}
}
cout<<"System #"<<Count++<<endl;
cout<<"The last domino falls after ";
if(time1>=time2){
///某关键牌最后倒下
///如果相等输出第一个 ,因为有只有一条边的情况
printf("%.1f ",time1);
cout<<"seconds, at key domino ";
cout<<pos+<<"."<<endl;
}else{
printf("%.1f ",time2);
cout<<"seconds, between key dominoes ";
cout<<pos1+<<" and "<<pos2+<<"."<<endl;
} } int read_case()//读入数据
{
cin>>n>>m;
if(n==) return ;
for(int i=;i<n;i++)
{
for(int j=;j<n;j++) Edge[i][j] = INF;///初始化邻接矩阵
}
//memset(Edge,INF,sizeof(Edge));///初始化邻接矩阵
int v1,v2,t;
for(int i=;i<m;i++)
{
cin>>v1>>v2>>t;
Edge[v1-][v2-] = Edge[v2-][v1-] = t;
}
return ;
}
int main()
{
while(read_case())
{
solve_case();
cout<<endl;
}
return ;
}
POJ 1135 -- Domino Effect(单源最短路径)的更多相关文章
- POJ 1135.Domino Effect Dijkastra算法
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10325 Accepted: 2560 De ...
- POJ 1135 Domino Effect (Dijkstra 最短路)
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9335 Accepted: 2325 Des ...
- POJ 1135 Domino Effect(Dijkstra)
点我看题目 题意 : 一个新的多米诺骨牌游戏,就是这个多米诺骨中有许多关键牌,他们之间由一行普通的骨牌相连接,当一张关键牌倒下的时候,连接这个关键牌的每一行都会倒下,当倒下的行到达没有倒下的关键牌时, ...
- 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(1130),ZOJ(1085)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=85 http://poj.org/problem?id=1130 这 ...
- Dijkstra单源最短路径,POJ(2387)
题目链接:http://poj.org/problem?id=2387 Dijkstra算法: //求某一点(源点)到另一点的最短路,算法其实也和源点到所有点的时间复杂度一样,O(n^2); 图G(V ...
- Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32824 Accepted: 11098 Description Bes ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
随机推荐
- 深入SpringBoot注解原理及使用
首先,先看SpringBoot的主配置类: @SpringBootApplication public class StartEurekaApplication { public static voi ...
- Jupyter安装和环境配置
配置: 1. 命令行启动 jupyter notebook 2. 也可以Anaconda直接启动 3. 设置token,如下图所示,命令行中输入 jupyter notebook list C:\Us ...
- ES查询语句
记录常用的es 查询 聚合 GET _cat / indices GET / p_ext_develop / _mapping / g GET / p_ext_develop / _analyze { ...
- Ubuntu系统---FeiQ安装记录
Ubuntu系统---FeiQ安装记录 linux下安装飞秋/飞鸽传书之类的软件iptux信使,可以与windows在一个局域网下聊天与传书文件,安装很简单. 首先,直接运行下面的语句即可:sudo ...
- Windows环境下使用uiautomatorviewer进行元素定位
一.摘要 元素定位本篇主要介绍如何使用uiautomatorviewer,通过定位到页面上的元素,然后进行相应的点击等操作,uiautomatorviewer 是 android-sdk 自带的一个元 ...
- 【高维前缀和】8.15B. 组合数
题目分析 没有接触过高维前缀和的话会有一点抽象
- queue的一些用法
import queue q = queue.Queue(3)# 指定队列大小,如果为空则为无限大 print(q.empty()) q.put('厉智') q.put('程劲') q.put('陈培 ...
- composer查看全局配置
composer config -l -g composer 更新慢 composer下载不下来问题解决 使用 Composer 镜像加速有两种选项: 选项一:全局配置,这样所有项目都能惠及(推荐): ...
- html([val|fn])
html([val|fn]) 概述 取得第一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档.直线电机选型 在一个 HTML 文档中, 我们可以使用 .html() 方法 ...
- Python数据抓取(3) —抓取标题、时间及链接
本次分享,jacky将跟大家分享如何将第一财经文章中的标题.时间以及链接抓取出来 (一)观察元素抓取位置 网页的原始码很复杂,我们必须找到特殊的元素做抽取,怎么找到特殊的元素呢?使用开发者工具检视每篇 ...