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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章