题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1596
解法:逆用dijkstra求最远距离
package hdu1596_findTheSafestRoad;
import java.text.DecimalFormat;
import java.util.Scanner;
/**
* submitted:Accepted
* algorithm:逆dijkstra
* @author Kindevil
*
*/
public class Main {
static double [][] G;
static double [] dist;
static boolean[] visit;
static int n;
static int INF=0xFFFFFFF;
static int q,s,destination;
public static void main(String args[])
{
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
n=cin.nextInt();
G=new double[n+1][n+1];
dist=new double[n+1];
visit=new boolean[n+1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
G[i][j]=cin.nextDouble();
}
}
q=cin.nextInt();
for(int i=0;i<q;i++)
{
s=cin.nextInt();
destination=cin.nextInt();
dijkstra(s);
DecimalFormat df = new DecimalFormat("0.000");
if(dist[destination]!=0) System.out.println(df.format(dist[destination]));
else System.out.println("What a pity!");
}
}
}
public static void dijkstra(int s)
{
for(int i=1;i<=n;i++)
{
dist[i]=G[s][i];
visit[i]=false;
}
visit[s]=true;
for(int x=1;x<=n;x++)
{
int u=s;
double maxdist=-INF;
for(int i=1;i<=n;i++)
{
if(visit[i]) continue;
if(dist[i]>maxdist)
{
u=i;
maxdist=dist[i];
}
}
visit[u]=true;
for(int i=1;i<=n;i++)
{
if(visit[i]) continue;
if(dist[u]*G[u][i]>dist[i])
{
dist[i]=dist[u]*G[u][i];
}
}
}
}
}