poj 1135 Domino Effect(dij)
2013-04-23 09:26
351 查看
题意:(看了半天没整明白)
有一个多米诺骨牌的游戏,我们知道有关键骨牌和普通骨牌,将关键骨牌推倒之后,整个骨牌阵就会倒下,推动其他的关键骨牌,其中推倒关键骨牌A使的关键骨牌B也倒,需要一定的时间,所以本题要求求出最后一个倒的骨牌的位置,及其时间...每个骨牌阵都由关键骨牌1推起
思路:对于倒的是关键骨牌我们可以通过Dijkstra来实现,而对于在中间倒的我们注意到一个现象——它所用的时间必然是这一行的两个关键骨牌到1骨牌的最短时间加上这一行的时间再除以2!!!用Dijkstra求出1点到其他点的最短时间,从中选个最大的MAX
然后求每行中间的,再求出最大的MAXJ然后比较MAXI和MAXJ的大小。
//
1176K
0MS
#include <stdio.h>
#include <string.h>
const int inf = 0x3f3f3f3f;
#define M 505
int mat[M][M];
int n;
void dij (int src)
{
double
dis[M];
int
mark[M],loc[2];
int
k,i,j;
for (i = 1;
i <= n; i ++)
{
dis[i] = mat[src][i];
mark[i] = 0;
}
dis[src] =
0;
mark[src] =
1;
int m = n -
1;
while (m
--)
{
int min = inf;
for (i = 1; i <= n; i ++)
if (!mark[i]&&dis[i]
< min)
{
k = i;
min = dis[i];
}
mark[k] = 1;
for (i = 1; i <= n; i ++)
if (!mark[i] && dis[i]
> dis[k] + mat[k][i])
dis[i] = dis[k] + mat[k][i];
}
double max =
0;
for (i = 2;
i <= n; i ++)
if (dis[i] > max)
{
k = i;
max = dis[i];
}
double maxj
= 0;
for (i = 1;i
<= n;i ++)
for (j = i+1;j <= n;j ++)
{
if (mat[i][j] != inf)
{
double tem = (dis[i] + dis[j] + mat[i][j])/2;
if (tem > maxj)
{
maxj = tem;
loc[0] = i;
loc[1] = j;
}
}
}
if (maxj
> max)
printf ("The last domino falls after %.1lf seconds, between key
dominoes %d and %d.\n\n",maxj,loc[0],loc[1]);
else
printf ("The last domino falls after %.1lf seconds, at key domino
%d.\n\n",max,k);
}
int main ()
{
int
m,i,j,u,v,w;
int count =
0;
while (scanf
("%d%d",&n,&m))
{
if (n == 0&&m == 0)
break;
memset (mat,0x3f,sizeof(mat));
while (m --)
{
scanf
("%d%d%d",&u,&v,&w);
mat[u][v] = w;
mat[v][u] = w;
}
printf ("System #%d\n",++count);
if (n == 1)
printf ("The last domino falls after 0.0 seconds, at key domino
1.\n\n");
else
dij (1);
}
return
0;
}
有一个多米诺骨牌的游戏,我们知道有关键骨牌和普通骨牌,将关键骨牌推倒之后,整个骨牌阵就会倒下,推动其他的关键骨牌,其中推倒关键骨牌A使的关键骨牌B也倒,需要一定的时间,所以本题要求求出最后一个倒的骨牌的位置,及其时间...每个骨牌阵都由关键骨牌1推起
思路:对于倒的是关键骨牌我们可以通过Dijkstra来实现,而对于在中间倒的我们注意到一个现象——它所用的时间必然是这一行的两个关键骨牌到1骨牌的最短时间加上这一行的时间再除以2!!!用Dijkstra求出1点到其他点的最短时间,从中选个最大的MAX
然后求每行中间的,再求出最大的MAXJ然后比较MAXI和MAXJ的大小。
//
1176K
0MS
#include <stdio.h>
#include <string.h>
const int inf = 0x3f3f3f3f;
#define M 505
int mat[M][M];
int n;
void dij (int src)
{
double
dis[M];
int
mark[M],loc[2];
int
k,i,j;
for (i = 1;
i <= n; i ++)
{
dis[i] = mat[src][i];
mark[i] = 0;
}
dis[src] =
0;
mark[src] =
1;
int m = n -
1;
while (m
--)
{
int min = inf;
for (i = 1; i <= n; i ++)
if (!mark[i]&&dis[i]
< min)
{
k = i;
min = dis[i];
}
mark[k] = 1;
for (i = 1; i <= n; i ++)
if (!mark[i] && dis[i]
> dis[k] + mat[k][i])
dis[i] = dis[k] + mat[k][i];
}
double max =
0;
for (i = 2;
i <= n; i ++)
if (dis[i] > max)
{
k = i;
max = dis[i];
}
double maxj
= 0;
for (i = 1;i
<= n;i ++)
for (j = i+1;j <= n;j ++)
{
if (mat[i][j] != inf)
{
double tem = (dis[i] + dis[j] + mat[i][j])/2;
if (tem > maxj)
{
maxj = tem;
loc[0] = i;
loc[1] = j;
}
}
}
if (maxj
> max)
printf ("The last domino falls after %.1lf seconds, between key
dominoes %d and %d.\n\n",maxj,loc[0],loc[1]);
else
printf ("The last domino falls after %.1lf seconds, at key domino
%d.\n\n",max,k);
}
int main ()
{
int
m,i,j,u,v,w;
int count =
0;
while (scanf
("%d%d",&n,&m))
{
if (n == 0&&m == 0)
break;
memset (mat,0x3f,sizeof(mat));
while (m --)
{
scanf
("%d%d%d",&u,&v,&w);
mat[u][v] = w;
mat[v][u] = w;
}
printf ("System #%d\n",++count);
if (n == 1)
printf ("The last domino falls after 0.0 seconds, at key domino
1.\n\n");
else
dij (1);
}
return
0;
}
相关文章推荐
- poj&nbsp;1135&nbsp;Domino&nbsp;Effect&nbsp;单源最短…
- poj&nbsp;2394&nbsp;Checking&nbsp;an&nbsp;Alibi(dij+h…
- poj1135 - Domino Effect
- TOJ 1883 ZOJ 1298 POJ 1135 Domino Effect / Dijkstra
- ACM: 图论题 poj 1135
- poj&nbsp;3463&nbsp;Sightseeing(dij)
- G - Domino Effect POJ - 1135
- poj&nbsp;2263&nbsp;Heavy&nbsp;Cargo&nbsp;(dij)
- Domino Effect POJ - 1135 题解
- poj 1135 有点弯的最短路运用
- ACM: poj 3141
- poj&nbsp;3013&nbsp;Big&nbsp;Christmas&nbsp;Tree&nbsp;(spf…
- poj&nbsp;2762&nbsp;Going&nbsp;from&nbsp;u&nbsp;to&nbsp;v&nbsp;or&nbsp;fr…
- poj&nbsp;1463&nbsp;Strategic&nbsp;game(树状DP…
- poj&nbsp;3275&nbsp;Ranking&nbsp;the&nbsp;Cows(floyd&nbsp;…
- poj&nbsp;3013&nbsp;Big&nbsp;Christmas&nbsp;Tree&nbsp;(解…
- poj&nbsp;1321&nbsp;棋盘问题
- POJ&nbsp;3006
- POJ&nbsp;1799
- POJ&nbsp;2136