现在做的是第四专题编号为1016的试题,具体内容如下所示:
Problem P
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 27 Accepted Submission(s) : 6
3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
0.500 0.400 0.500
简单题意:
找一条最安全的路
解题思路:
找一条最安全的路则需要安全度最大,因为ek是P上的边,而且s是在0~1之间的数,相乘的越少则安全度越大,所以还是一个最短路径的问题,可以用dijstral算法求得。
编写代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#define maxn 10000
using namespace std;
int vis[10100],n,mm;
double map[1010][1010],d[10100];
void dijkstra(int start)
{
int i,y,x;
double m;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
d[i]=map[start][i];
for(i=1;i<=n;i++)
{
m=-maxn;
for(y=1;y<=n;y++)
if(!vis[y]&&d[y]>m)
{
m=d[y];
x=y;
}
vis[x]=1;
for(y=1;y<=n;y++)
d[y]=max(d[y],d[x]*map[x][y]);
}
}
int main ()
{
int m,i,j;
while (scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lf",&map[i][j]);
scanf("%d",&m);
while (m--)
{
scanf("%d %d",&i,&j);
dijkstra(i);
if (d[j]>0)
printf ("%.3lf\n",d[j]);
else
printf ("What a pity!\n");
}
}
return 0;
}