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. 05_ Flume多级Agent之间串联案例

    多级agent之间串联: 从tail命令获取数据发送到avro端口,另一个节点可配置一个avro源来获取数据,发送外部存储 启动两个Agent节点: 使用scp命令拷贝flume安装包到另一台虚拟机; ...

  2. springMVC的详解

    一,springmvc注解特性 1.@Controller 控制器定义在 spring 3.0 中,通过@controller 标注即可将 class 定义为一个 controller 类.为使 sp ...

  3. (转)VMware虚拟机三种网络模式的区别及配置方法;

    我的一点实际经验理解桥接和NAT 桥接是虚拟机完全作为一个独立的地址接在局域网中,NAT是虚拟机依赖宿主主机地址转换的一种方式 例子我的虚拟机如果用桥接模式,连接外部网站如百度时会提示此pc没有装公司 ...

  4. ThreadPoolExecutor源码分析一

           在线程池出现之前,每次需要使用线程,都得创建一个线程.但是,在java的运行环境中,创建一个线程是非常耗费资源和时间的.是否可以把线程重复利用,减少线程的创建次数.基于此,java1.5 ...

  5. 如何用win10自带linux系统学习c语言---解决gdb使用问题

    1.windos store---ubuntu18 2.改安装源 3.装gcc   apt-install 即可 4.装gdb       apt-instll 即可 5.写helloworld 记做 ...

  6. Go学习笔记(六) | 使用swaggo自动生成Restful API文档(转)

    关于Swaggo 或许你使用过Swagger, 而 swaggo就是代替了你手动编写yaml的部分.只要通过一个命令就可以将注释转换成文档,这让我们可以更加专注于代码. 目前swaggo主要实现了sw ...

  7. 云主机用samba服务实现和windows共享文件

    最近刚刚入坑了百度云的云主机BCC,准备在云主机上实现samba服务,映射到本机来当硬盘使用,可是一直怎么试都不成功,后来咨询客服之后才知道samba默认使用的端口445端口被运营商封禁了,只好更改端 ...

  8. Clone failed: Could not read from remote repository

    问题: 使用idea下载项目代码时报错,内容如下: Clone failed: Could not read from remote repository 解决方案: 把 SSH切换成 HTTP重新c ...

  9. MFC、API、C++三者的区别

    MFC(Microsoft Foundation Class)是微软的基础类库,只能用于Windows系统. API(Application Programming Interface)是应用程序编程 ...

  10. Maven手动将jar导入本地仓库

    1.使用cmd进入maven安装目录下的bin 2.运行mvn install:install-file -Dfile=jar包的路径 -DgroupId=gruopId中的内容 -Dartifact ...