永发信息网

freepascal 多米诺问题 图

答案:3  悬赏:50  手机版
解决时间 2021-05-23 19:19

 求完整代码。。。

 

Domino效应

(Domino Effect)

你知道用Domino骨牌除了玩Domino游戏外还能干其它事吗?把一些骨牌排成一列,相邻骨牌间相距很小的距离。如果你排的恰到好处,当你对倒第一块骨牌之后,后面的骨牌依次倒下(称为“Domino效应”)。

如果只有很少的骨牌,这就显得似乎没什么意义。一些人用数以万计的不同颜色不同材料的骨牌排满整个大厅,摆出各种图案,创造(虽然短命)艺术。在这些“建筑”中通常会有不止一排骨牌同时倒下。正如你所想象的那样,计时在这里是一个必不可少的因素。

现在轮到你工作了。你必须写一个程序,对于给定的一个骨牌系统,计算最后一块骨牌倒下的时间。系统中有一些“关节骨牌”,它们由另一些骨牌排连接。当一个关节骨牌倒下后,与它相连的骨牌排开始倒(除了那些已经倒的),“倒”将传到其它关节骨牌,并使它们倒。你可假定所有的骨牌倒下的时间相等。

输入格式

从文件domino.in输入。第一行为关节骨牌的个数n (1 £ n < 500),和连接它们的骨牌排的个数m。关节骨牌的编号从1到n。下面有m行描述m个骨牌排。每行由三个整数a, b, l,其中a, b为该骨牌排连接的关节骨牌编号,l表示从a倒到b(或从b倒到a)需要l秒。每两个关节骨牌间至多有一个骨牌排。任两个关节骨牌之间至少有一条“路”(一序列相连的骨牌排)连接。

开始时,关节骨牌1将被推倒。

输出格式

输出到文件domino.out。按样例中的格式输出最后一块骨牌倒下的时刻和位置。

样例输入与输出

domino.in

domino.out

2 1

1 2 27

The last domino falls after 27.0 seconds, at key domino 2.

3 3

1 2 5

1 3 5

2 3 5

The last domino falls after 7.5 seconds, between key dominoes 2 and 3.

解答

这道题较简单,我们可以先构造图G=(V,E),G的顶点就是所有的关节骨牌,如果两个关节骨牌之间有骨牌排连接,则相应点之间有无向边,从关节骨牌a倒到关节骨牌b的用时为无向边的权w(ab)。

最后一个倒下的骨牌可能为

(i) 某个关节骨牌k,其倒下的时间为顶点1到顶点k的最短路长;或者是

(ii) 某个骨牌排ab中的骨牌。假设关节骨牌a和关节骨牌b的倒下时间分别为d(a)和d(b),d(a)和d(b)分别为顶点1到顶点a和顶点b的最短路长,则骨牌排ab中最后一块倒下的骨牌的倒下时间为max{d(a),d(b)}+[w(ab)+|d(a)-d(b)|]/2

假设我们已经求出了顶点1到所有顶点的最短路长d(1),d(2),…,d(n),记L(a,b)=max{d(a),d(b)}+[w(ab)+|d(a)-d(b)|]/2

则最后一块骨牌倒下的时间为max{d(a),L(a,b)]

根据以上分析,我们可以先写出Dijkstra的求最短路的代码,然后插入求最后一块骨牌倒下时间的代码,就像下面的算法所做的那样:

PROBLEM-Dominio-Effect()

1         input n, m

2         for a←1 to n

3           do for b←1 to n

4                do w[a][b]←+¥

5         for i←1 to m

6           do input a, b, t

7              w[a][b]←w[b][a]←t

8         lastA ← lastB ← 1

9         lastT ← 0

10     for i←1 to n

11       do d[i]←+¥

12          c[i]←FALSE

13     d[1]←0

14     for i←1 to n

15       do a←0

16          for b←1 to n

17            do if Øc[b] Ù (a=0 Ú d[a]>d[b])

18                 then a←b

19          if d[a]>lastT

20            then lastT ← d[a]

21                 lastA ← lastB ← a

22          for b←1 to n

23            do if d[a] + t[a][b] < d[b]

24                 then d[b] ← d[a] + t[a][b]

25                 else t←min(d[a],d[b])+(t[a][b] - | d[a]-d[b] | )/2

26                     if c[b] Ù t>lastT

27                       then lastT ← t

28                            lastA ← min(a,b)

29                            lastB ← max(a,b)

30          c[a]←TRUE

31     output “The last domino falls after “, lastT, “ seconds, “

32     if lastA = lastB

33       then output "at key domino ", lastA, “.¿”

34       else output "between key dominoes “, lastA, “ and “, lastB, “. ¿"

算法第1-7行输入数据并立刻转换为图,第8-30行是标准的Dijkstra算法,其中第19-21行和第25-29行不属于求最短路,而是求最后一块骨牌的倒下时间。


最佳答案
哈哈,不告诉你。
全部回答

program domiluo (output, input);

var a : integer;

begin:

writeln('多米诺骨牌')

end.

多米诺啊...改天我们掰开来看看...

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
火星和土星是个什么样的星体?
金太阳广告这个地址在什么地方,我要处理点事
从昆山到景德镇的火车路线
寻求爱情的句子,关于强求的句子
现代的音乐和古代的音乐
90后李宁现在在哪几个城市有专卖店?
FC热血物语中文版密码要怎么输入,最好截图说
联想P619手机锁
“2011年,94 9264 我634 24 286人,98 944 966
如何装地暖,大家觉得在南方到底要不要装地暖
那冠地址在什么地方,想过去办事
山字加个乘念什么,山字和个高字念什么
会计分录 怎么写呀》
QQ群最多能加多少人
谁有实况2010德甲、中超补丁+中文解说
推荐资讯
宝宝取名很关键
傻子为什么容易被周围的人骂成废品?
滦平县的东南方向有哪些城市?
不好意思是什么意思,父亲为什么叫令尊?
如果相爱后,天天在一起,一方反感后,怎样让
关于新年愿望的作文怎么写?
诛仙我网一幻风的元宝1:160大概YB多少能带75
求乔洋唱的《放弃》的空间歌曲链接!
诺基亚智能机哪款比较好?
有学问的一些句子,有哪些词语,句子形容有学
X5中夜色玄翼怎么买不了?
国家大剧院、首都博物馆、天坛公园、颐和园、
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?