[最短路径] HDU 1596 - find the safest road

来源:互联网 发布:网络流行文化有哪些 编辑:程序博客网 时间:2024/05/16 12:09

此题可以利用求最短路径的思想来解决,贪心的过程每次找最大值即可。


#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <iostream>#include <set>#include <map>#include <queue>#include <stack>#include <assert.h>#include <time.h>typedef long long LL;const int INF = 500000001;const double EPS = 1e-9;const double PI = acos(-1.0);using namespace std;int n, s, e, vis[1001];double graph[1001][1001], dis[1001];void Dijkstra(){    memset(vis, -1, sizeof(vis));    for(int i = 1; i <= n; i++)    {        dis[i] = graph[s][i];    }    vis[s] = 0;    for(int i = 1; i < n; i++)    {        double maxx = 0;        int k = -1;        for(int j = 1; j <= n; j++)        {            if(vis[j] == -1 && maxx < dis[j])            {                maxx = dis[j];                k = j;            }        }        if(k == -1) break;        vis[k] = 0;        for(int j = 1; j <= n; j++)        {            if(vis[j] == -1 && dis[j] < dis[k] * graph[k][j])            {                dis[j] = dis[k] * graph[k][j];            }        }    }}int main(){    #ifdef _T1est        freopen("test0.in", "r", stdin);        freopen("test0.out", "w", stdout);        srand(time(NULL));    #endif    int Q;    while(~scanf("%d", &n))    {        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%lf", &graph[i][j]);            }        }        scanf("%d", &Q);        while(Q--)        {            scanf("%d %d", &s, &e);            Dijkstra();            if(dis[e])                printf("%.3f\n", dis[e]);            else                printf("What a pity!\n");        }    }    return 0;}
0 0