• hdoj 1596 find the safest rode


    Problem Description
    XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在8600 想出去旅游,面对这这么多的路,他想找一条最安全的路。但是8600 的数学不好,想请你帮忙 ^_^
     
    Input
    输入包括多个测试实例,每个实例包括:
    第一行:n。n表示城市的个数n<=1000;
    接着是一个n*n的矩阵表示两个城市之间的安全系数,(0可以理解为那两个城市之间没有直接的通道)
    接着是Q个8600要旅游的路线,每行有两个数字,表示8600所在的城市和要去的城市
     
    Output
    如果86无法达到他的目的地,输出"What a pity!",
    其他的输出这两个城市之间的最安全道路的安全系数,保留三位小数。
     
    Sample Input
    3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
     
    Sample Output
    0.500 0.400 0.500
     
    思路:算法还是利用dijkstra算法,只要改成求的是最大距离就好了,要注意数的类型
     
     1 #include <stdio.h>
     2 #include <algorithm>
     3 int n, q;
     4 double safe[1010], sa[1010][1010];
     5 int vis[1010];
     6 double max(double x, double y)
     7 {
     8     return x > y ? x : y;
     9 }
    10 void dijkstra(int s, int t)
    11 {
    12     int u, v;
    13     for(u = 1; u <= n; u++)
    14     {
    15         vis[u] = 0;
    16         safe[u] = 0.0;
    17     }
    18     safe[s] = 1.0;
    19     while(true)
    20     {
    21         v= -1;
    22         for(u = 1; u <= n; u++)
    23             if(!vis[u] && (safe[u]>safe[v] || v==-1))
    24                 v = u;
    25         if(v == -1)
    26             break;
    27         vis[v] = 1; 
    28         for(u = 1; u <= n; u++)
    29         {
    30             safe[u] = max(safe[u], safe[v]*sa[v][u]);
    31         }
    32     }
    33     if(safe[t] == 0.0)
    34         printf("What a pity!
    ");
    35     else
    36         printf("%.3f
    ", safe[t]);
    37 }
    38 int main()
    39 {
    40     double s;
    41     while(~scanf("%d", &n))
    42     {
    43         for(int i = 1; i <= n; i++)
    44             for(int j = 1; j <= n; j++)
    45             {
    46                 scanf("%lf", &s);
    47                 if(i <= j)
    48                     sa[i][j] = sa[j][i] = s;
    49             }
    50         scanf("%d", &q);
    51         while(q--)
    52         {
    53             int a, b;
    54             scanf("%d%d", &a, &b);
    55             dijkstra(a, b); 
    56         }
    57     }    
    58     return 0;
    59 }

     spfa算法代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 #define INF 0x3f3f3f3f
     5 #define N 1010
     6 #define M 10000010
     7 using namespace std;
     8 int n, cnt;
     9 int vis[N], head[N];
    10 double dis[N];
    11 struct node
    12 {
    13     int from, to, next;
    14     double val;
    15 }edge[M];
    16 void add(int x, int y, double z)
    17 {
    18     node e = {x, y, head[x], z};
    19     edge[cnt] = e;
    20     head[x] = cnt++;
    21 }
    22 void spfa(int s, int e)
    23 {
    24     queue<int>q;
    25     for(int i = 1; i <= n; i++)
    26     {
    27         dis[i] = 0.0;
    28     }
    29     memset(vis, 0, sizeof(vis));
    30     q.push(s);
    31     dis[s] = 1.0;
    32     vis[s] = 1;
    33     while(!q.empty())
    34     {
    35         int u = q.front();
    36         q.pop();
    37         vis[u] = 0;
    38         for(int i = head[u]; i != -1; i = edge[i].next)
    39         {
    40             int v = edge[i].to;
    41             if(dis[v] < dis[u]*(edge[i].val))
    42             {
    43                 dis[v] = dis[u]*(edge[i].val);
    44                 if(!vis[v])
    45                 {
    46                     vis[v] = 1;
    47                     q.push(v);
    48                 }
    49             }
    50         } 
    51     }
    52     if(dis[e] == 0.0)
    53         printf("What a pity!
    ");
    54     else
    55         printf("%.3f
    ", dis[e]);
    56 }
    57 int main()
    58 {
    59     while(~scanf("%d", &n))
    60     {
    61         double a;
    62         cnt = 0;
    63         memset(head, -1, sizeof(head));
    64         for(int i = 1; i <= n; i++)
    65             for(int j = 1; j <= n; j++)
    66             {
    67                 scanf("%lf", &a);
    68                 add(i, j, a);
    69             }
    70             
    71         int b;
    72         scanf("%d", &b);
    73         while(b--)
    74         {
    75             int start, end;
    76             scanf("%d%d", &start, &end);
    77             spfa(start, end);
    78         }
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    2015PPTV校招笔试详解
    2015华数校招笔试详解
    2015我的校招之路
    2015美团校招笔试试题
    关于联想超极本装入Ubuntu系统无法开启无线硬件开关的解决
    RabbitMQ
    office 2016 for mac 下拉框 无法展开问题
    mac 下 tomcat7的安装
    mac 10.11.6,Xcode8下,ruby2.3安装,Cocoapods安装~
    学习的学习的方法
  • 原文地址:https://www.cnblogs.com/digulove/p/4738523.html
Copyright © 2020-2023  润新知