1 题目大意

你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一些多米诺骨牌,竖着排成连续的一行,两张骨牌之间只有很短的空隙。如果排列得很好,当你推倒第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 为测试数据的序号;然后再输出一行,首先是最后一块骨牌倒下的时间,精确到小数点后一位有效数字,然后是最后倒下骨牌的位置,这张最后倒下的骨牌要么是关键牌,要么是两张关键牌之间的某张普通牌。输出格式如样例输出所示。如果存在多个解,则输出任意一个。每个测试数据的输出之后输出一个空行。

2 题目分析

这是一道最短路径题目,但是要判断哪种最优解的情况。设res为最后一张牌倒下的时刻,pos_i和pos_j记录的是最后倒下的关键牌的标号,初始化都为-1。

a) 如果最后一张倒下的是关键牌。利用Dijkstra 算法求第1 张关键牌到其他每张关键牌的最短路径,保存在dist[i]。然后取dist[i]的最大值,设为res,pos_i记录关键牌序号。

b) 如果最后一张倒下的是两张关键牌之间的普通牌。设该行两端的关键牌为i 和j,他们以每秒一个单位的速度相向而行,设i和j分别经过t1和t2秒相遇,i和j之间的距离为g[i][j],求i和j在什么时刻相遇。不难列出方程:t1+t2=g[i][j],dis[i]+g[i][j]=dis[j]+g[i][j]。则i和j相遇的时刻为t=(dist[i] + dist[j] +g[i][j])/2.0。res=min(res,t)。pos_i和pos_j记录两张关键牌的序号。(注意:要满足dis[i]+g[i][j]>dis[j]并且dis[j]+g[i][j]>dis[i]才应该计算t值)

c) 如果pos_j=-1,则是a情况;否则是b情况(如果b情况成立,pos_j的值应该改变了)。

3代码

#include<stdio.h>

#include<string.h>

#define MAXV 501

#define MAXINT 999999999

double res;

int pos_a,pos_b;

int g[MAXV][MAXV],vis[MAXV],dis[MAXV],p[MAXV];

void initial()

{

int i,j;

for(i=0;i<MAXV;i++)

{

vis[i]=0;

dis[i]=MAXINT;

p[i]=-1;

for(j=0;j<MAXV;j++)

{

if(i!=j)

g[i][j]=MAXINT;

}

}

res=-MAXINT;

pos_a=-1;

pos_b=-1;

}

void dijkstra(int nvertex,int start)

{

int v,i,j,distance;

dis[start]=0;

v=start;

while(!vis[v])

{

vis[v]=1;

for(i=1;i<=nvertex;i++)

{

if(!vis[i] && dis[i]>(dis[v]+g[v][i]))

{

dis[i]=dis[v]+g[v][i];

p[i]=v;

}

}

distance=MAXINT;

for(i=1;i<=nvertex;i++)

{

if(!vis[i] && dis[i]<distance)

{

distance=dis[i];

v=i;

}

}

}

for(i=1;i<=nvertex;i++)

{

if(res<dis[i])

{

res=dis[i];

pos_a=i;

}

}

double temp;

for(i=1;i<=nvertex;i++)

{

for(j=1;j<=nvertex;j++)

{

if(i!=j && g[i][j]<MAXINT && dis[i]+g[i][j]>dis[j] && dis[j]+g[i][j]>dis[i])

{

temp=1.0*(dis[i]+dis[j]+g[i][j])/2;

if(res<temp)

{

res=temp;

if(i<j)

{

pos_a=i;

pos_b=j;

}

else

{

pos_a=j;

pos_b=i;

}

}

}

}

}

}

int main()

{

int n,m,count=1;

while(2==scanf("%d%d",&n,&m))

{

if(0==n && 0==m)

break;

initial();

int i,a,b,c;

for(i=1;i<=m;i++)

{

scanf("%d%d%d",&a,&b,&c);

g[a][b]=g[b][a]=c;

}

dijkstra(n,1);

printf("System #%d\n",count++);

if(-1==pos_b)

printf("The last domino falls after %.1lf seconds, at key domino %d.\n\n",res,pos_a);

else

printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n\n",res,pos_a,pos_b);

}

return 0;

}

poj 1135 Domino Effect (Dijkstra)相关推荐

  1. Poj 1135 Domino Effect(Dijkstra)

    题目描述: 你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两张骨牌之间只有很短的空隙.如果排列得很好,当你推 倒第1 张骨牌,会使 ...

  2. POJ 1135 -- Domino Effect(单源最短路径)

     POJ 1135 -- Domino Effect(单源最短路径) 题目描述:  你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行, ...

  3. POJ 1135 Domino Effect(最短路 多米诺骨牌)

    题意 题目描述:  你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两张骨牌之间只有很短的空隙.如果排列得很好,当你推 倒第 1张骨 ...

  4. UVa 211 The Domino Effect 多米诺效应 暴力搜索

    题目链接:UVa 211 The Domino Effect 题目描述: 一张多米诺骨牌拥有两个数值,一共有二十八张不同的多米诺骨牌,这二十八张多米诺骨牌的点数如下图所示: 上图的 B o n e B ...

  5. 「POJ 1135」Domino Effect(dfs)

    BUPT 2017 Summer Training (for 16) #3G 题意 摆好的多米诺牌中有n个关键牌,两个关键牌之间有边代表它们之间有一排多米诺牌.从1号关键牌开始推倒,问最后倒下的牌在哪 ...

  6. POJ 3984 迷宫问题 (Dijkstra)

    迷宫问题 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, ...

  7. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))

    题目大意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费.有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到了晚上再返回点 ...

  8. POJ - 1847 Tram(dijkstra)

    题意:有向图有N个点,当电车进入交叉口(某点)时,它只能在开关指向的方向离开. 如果驾驶员想要采取其他方式,他/她必须手动更换开关.当驾驶员从路口A驶向路口B时,他/她尝试选择将他/她不得不手动更换开 ...

  9. POJ 1511 Invitation Cards——Dijkstra优先队列优化+反向建图

    [题目描述] In the age of television, not many people attend theater performances. Antique Comedians of M ...

最新文章

  1. 【Netty】什么是编码器和解码器?
  2. Google公布OpenFermion:量子计算机的开源软件包
  3. UVa11039 Building designing(贪心算法)
  4. 新浪短网址生成java_如何生成t.cn的短链接?新浪短网址怎么生成的?
  5. API 调用次数限制实现
  6. 刷新DNS解析缓存+追踪+域名解析命令
  7. Apache Spark 1.5发布,新特性一览
  8. python123测验答案测验3_知到app数学分析3-3测验答案查询服务
  9. UVA10190 Divide, But Not Quite Conquer!【等差数列】
  10. 解决......lib/include/THC/THCGeneral.h:12:18: fatal error: cuda.h: No such file or directory报错问题
  11. 自制Openerp图表
  12. 如何解决“数据错误,循环冗余检查”
  13. (转)当android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程 .
  14. Ubuntu安装虚拟机
  15. ES6之三个点(扩展运算符及rest运算符)
  16. JDK1.8版本linux、Windows64下载
  17. 网易游戏岗位大揭秘——我在网易做测试开发(QA)
  18. LED驱动电源各项指标测试方法
  19. LeetCode 518 Coin Change 2 (python)
  20. [转载]JScript 语法错误

热门文章

  1. LaTeX语法学习(一):数学公式篇
  2. 【前端】浏览器插件制作
  3. Intelnbsp;Fortran安装netcdf库amp;n…
  4. 忘记了PDF密码?快速找回密码的实用方法!
  5. Kubernetes监控Heapster介绍
  6. 小程序页面之间数据传递的五种方法
  7. 基于springboot考研资讯管理系统
  8. Javascript语法基础之按钮点击事件
  9. js中获取随机数的方法
  10. JAVA中变量的命名规范