HDU 1569 find the safest road

这道题用Floyd和dijkstra均可以解出。
将各条路径的成绩值维护一下即可,也可以对各条路上的权值取对数,这样所有的路都变成了负值。找乘积的最大值,也就是找负值的最大值即可,贴出第一种方法的AC代码:

#include<iostream>
#include<stdio.h>
using namespace std;
double safe[1010][1010];
//double map[1010][1010];
int n;

void floyd()
{
    for(int k = 0 ; k < n;k++)
    for(int i = 0 ; i < n;i++)
    for(int j = 0 ; j < n;j++)
    if(safe[i][k]*safe[k][j] > safe[i][j])
          safe[i][j] = safe[i][k]*safe[k][j];
}
int main()
{
    while(~scanf("%d",&n))
    {
    for(int i = 0 ; i < n;i++)
    for(int j = 0 ; j< n;j++)
    {
        scanf("%lf",&safe[i][j]);
    }

    floyd();
    int k;
    scanf("%d",&k);
    while(k--)
    {
        int x,y;
        cin>>x>>y;
        x--,y--;
        if(safe[x][y])
            printf("%.3lf",safe[x][y]);
        else 
            printf("What a pity!");
        puts("");
    }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章