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(单源最短路径)的更多相关文章

  1. POJ 1135.Domino Effect Dijkastra算法

    Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10325   Accepted: 2560 De ...

  2. POJ 1135 Domino Effect (Dijkstra 最短路)

    Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9335   Accepted: 2325 Des ...

  3. POJ 1135 Domino Effect(Dijkstra)

    点我看题目 题意 : 一个新的多米诺骨牌游戏,就是这个多米诺骨中有许多关键牌,他们之间由一行普通的骨牌相连接,当一张关键牌倒下的时候,连接这个关键牌的每一行都会倒下,当倒下的行到达没有倒下的关键牌时, ...

  4. 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 ...

  5. [POJ] 1135 Domino Effect

    Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12147 Accepted: 3046 Descri ...

  6. 广搜,深搜,单源最短路径,POJ(1130),ZOJ(1085)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=85 http://poj.org/problem?id=1130 这 ...

  7. Dijkstra单源最短路径,POJ(2387)

    题目链接:http://poj.org/problem?id=2387 Dijkstra算法: //求某一点(源点)到另一点的最短路,算法其实也和源点到所有点的时间复杂度一样,O(n^2); 图G(V ...

  8. Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32824   Accepted: 11098 Description Bes ...

  9. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

随机推荐

  1. 在Ubuntu中使用uwsgi 启动 Django ,但是静态文件映射出错

    错误 :  找不到/static/下面的静态文件 解决方法: 在uswgi.ini 文件中配置参数 static-map=/static=/home/wb/Desktop/test_django/st ...

  2. SAP分析云及协同计划

    大家好, 我是SAP成都研究院S/4HANA Sales 团队的软件工程师Derek.四年前我从SAP Consulting团队转到SAP Labs从事Sales Analytics相关应用的开发,在 ...

  3. 在线播放mp4

    在线播放mp4 1.准备好支持再网页上播放的mp4格式 AVC(h264) 格式的mp4 2.用ckplayer控制播放 (1)到ckplayer下载js.如:http://www.ckplayer. ...

  4. CentOS系统 Amoeba+MySql主从读写分离配置 适合新手傻瓜式教程!-----仅供参考!

    废话不说,直接开始: 一.安装mysql的三种方式,这里采用第2种(安装方式不再详解,请参照) http://www.cnblogs.com/babywaa/articles/4837946.html ...

  5. 前端基础(九):SweetAlert(弹出框)

    简介 SweetAlert是一款很好用的弹出框框架 下载 点我下载 导入 博主用的是bootstrap-sweetalert,所以要依赖bootstrap,导入前先导入原生jQuery以及bootst ...

  6. Ubuntu下PHP+MySQL+Apache+PHPStorm的安装和配置

    粘贴自:https://www.jianshu.com/p/a6a0d2a29591 1.Apache的安装: $ sudo apt-get update $ sudo apt-get install ...

  7. Scala快速入门(四)——继承、接口

    Scala快速入门(四)--继承.接口 一.继承 1.继承的概念:省略 2.模板: class Person(n:String,a:Int) { var name:String=n var age:I ...

  8. 作业九——DFA最小化

    1.将DFA最小化:教材P65 第9题 I {1, 2, 3, 4, 5} {6, 7} {1, 2}b->{1, 2, 3, 4, 5} {3, 4}b->{6, 7} {5}b-> ...

  9. RNN基础

    RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关.具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅 ...

  10. 如何让Python2与Python3共存

    一.摘要 最近做服务测试的时候,实在被第三方模块折磨的够呛,从安装就存在兼容Py2和Py3的问题,产品提供的服务越来越多,做服务验证也不得不跟进支持测试,这眼前的Hadoop/Hive/Hbase/H ...