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 年 ...
随机推荐
- 系统性能分析-vmstat命令详解
最近温馨巩固Linux 操作系统的 vmstat命令,这个命令所能打印的系统信息满多的,比较好用,就顺当记录下重要的点,方便以后排查系统问题时拿出来用 字段 含义 procs 进程信息字段: -r:正 ...
- Linux学习(四)-Linux常用命令
1.运行级别类 1.1运行级别说明: 0:关机 1:单用户[可用于找回丢失密码] 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用运行级 ...
- react——css样式
1.行内样式: 两个大括号包着.第一个大括号表示里面写js,第二个大括号里面是样式对象 2.传对象 将对象和结构分离,直接写一个大括号,里面写对象 3.将所有的样式对象合并成一个大对象,直接点 以上样 ...
- 基于SAML2.0的SAP云产品Identity Authentication过程介绍
SAP官网的架构图 https://cloudplatform.sap.com/scenarios/usecases/authentication.html 上图介绍了用户访问SAP云平台时经历的Au ...
- SpringMVC的工作原理(转)
SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMa ...
- beego从入门到弃坑(一)
最近由于要写课程设计的原因,我便开始一边学习beego,一边开始用它写一个小型的管理系统.但是只有你真正的去用的时候,才会发现这个框架巨坑,他是第一个让我写出了心里阴影的框架,也是第一个让我写着写 ...
- linux 中free命令
1.free 命令的选项使用 free 命令查看服务器内存使用情况.free [-b|-k|-m|-g|-h] [-l] [-o] [-t] [-s delay] [-c count] [-V](1) ...
- DataTable序列化及反序列化Json
添加Json解析引用 using Newtonsoft.Json; 实现方式一:普通转换 private void button1_Click(object sender, EventArgs e) ...
- STM32——CAN总线过滤器设置
STM32CAN控制器每个筛选器组由两个32位的寄存器组成. 根据所需位宽的不同,各个筛选器可配置成16位或32位模式(如下图,当FSCx=1为32位模式,FSCx=0时为16位模式).同时,筛选器的 ...
- 底部版权时间自动变化,网页在线qq咨询
<p><small>© 众筹网<script>document.write(new Date().getFullYear());</script> &l ...