转载请注明出处:http://blog.csdn.net/a1dark
分析:这道题就是对dijkstra算法模板的一个变形应用、spfa也可做、下面给出dijkstra的代码
主要就是修改一下初始值、以及松弛的时候取更大的值、
#include<stdio.h>
float map[1001][1001],dist[1001];
int vis[1011];
int n,v;
void dijstra(int s)
{
int i,j;
for(i=1;i<=n;i++)
{
vis[i]=1;
dist[i]=map[s][i];
}
vis[s]=0;
dist[s]=map[s][s];
for(i=1;i<=n;i++)
{
float max=0;
for(j=1;j<=n;j++)
{
if(vis[j]==1&&max<dist[j])
{
v=j;
max=dist[j];
}
}
vis[v]=0;
for(j=1;j<=n;j++)
{
if(vis[j]==1&&map[v][j]*dist[v]>dist[j])
dist[j]=map[v][j]*dist[v];
}
}
}
int main()
{
int i,j,t,s,e;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%f",&map[i][j]);
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&s,&e);
dijstra(s);
if(dist[e]==0)
printf("What a pity!\n");
else
printf("%.3f\n",dist[e]);
}
}
return 0;
}