您的位置:首页 > Web前端

UVa 318 - Domino Effect(zoj 1298)

2017-03-21 12:10 537 查看
題目:有一些擺好的多米諾骨牌,推到第一塊,問最後倒下的骨牌的位置和時間。

分析:圖論、最短路。利用dijistra算法計算最短路,枚舉環找到最長的,輸出。

            題目要求最后到下的骨牌,即為路徑中到1號骨牌最短路最遠的點;

            因為可能存在環路,則最後在兩個骨牌間倒下;

            首先,計算骨牌1的單元最短路;

            然後,枚舉所有的最短路構成的環(加上一條邊),找到最長的路徑即可;

說明:╮(╯▽╰)╭。

#include <stdio.h>
#include <stdlib.h>

double oo = 1e20;
double maps[505][505];
double dist[505];
int used[505];

int main()
{
int n, m, u, v, s, cases = 1;
while (~scanf("%d%d",&n,&m) && n) {
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
maps[i][j] = oo;
}
maps[i][i] = 0;
}
for (int i = 1; i <= m; ++ i) {
scanf("%d%d%d",&u,&v,&s);
maps[u][v] = s;
maps[v][u] = s;
}

for (int i = 1; i <= n; ++ i) {
dist[i] = oo;
used[i] = 0;
}
dist[1] = 0;
used[1] = 1;
int now = 1;
for (int i = 2; i <= n; ++ i) {
for (int j = 2; j <= n; ++ j) {
if (maps[now][j] && dist[j] > dist[now] + maps[now][j]) {
dist[j] = dist[now] + maps[now][j];
}
}

double min = oo;
for (int j = n; j >= 1; -- j) {
if (!used[j] && dist[j] < min) {
now = j;
min = dist[j];
}
}
used[now] = 1;
}

double ans = dist[now];
int p1 = 1, p2 = 1, flag = 0;
for (int i = 1; i <= n; ++ i) {
for (int j = i+1; j <= n; ++ j) {
if (maps[i][j] < oo && ans < 0.5*(dist[i]+dist[j]+maps[i][j])) {
ans = 0.5*(dist[i]+dist[j]+maps[i][j]);
p1 = i;
p2 = j;
flag = 1;
}
}
}

printf("System #%d\nThe last domino falls after %.1lf ",cases ++,ans);
if (!flag) {
printf("seconds, at key domino %d.\n\n",now);
}else {
printf("seconds, between key dominoes %d and %d.\n\n",p1,p2);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: