zoukankan      html  css  js  c++  java
  • find the safest road

    find the safest road

    Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 23   Accepted Submission(s) : 12
    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
     代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define MAX(x,y)(x>y?x:y)
     4 const int MAXN=1010;
     5 double map[MAXN][MAXN],d[MAXN];
     6 int vis[MAXN];
     7 int n;
     8 void initial(){
     9     memset(d,0,sizeof(d));
    10     memset(vis,0,sizeof(vis));
    11 }
    12 void dijskra(int s){
    13     initial();//写错位置了,应该每次都初始化
    14     d[s]=1;
    15     while(true){
    16             int k=-1;
    17         for(int i=1;i<=n;i++)
    18             if(!vis[i]&&(k==-1||d[i]>d[k]))k=i;
    19     if(k==-1)break;
    20     vis[k]=1;
    21     for(int i=1;i<=n;i++)
    22         d[i]=MAX(d[i],d[k]*map[k][i]);
    23     }
    24 }
    25 int main(){int Q,a,b;
    26     while(~scanf("%d",&n)){
    27             memset(map,0,sizeof(map));
    28         for(int i=1;i<=n;i++)
    29         for(int j=1;j<=n;j++)
    30             scanf("%lf",&map[i][j]);
    31         scanf("%d",&Q);
    32         while(Q--){
    33             scanf("%d%d",&a,&b);
    34             dijskra(a);
    35             if(d[b]==0.0)puts("What a pity!");
    36             else printf("%.3lf
    ",d[b]);
    37         }
    38     }
    39     return 0;
    40     }

     SPFA:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<queue>
     4 using namespace std;
     5 const int MAXN=1010;
     6 const int MAXM=2000010;
     7 int head[MAXM],vis[MAXN];
     8 double dis[MAXN];
     9 struct Edge{
    10     int from,to,next;
    11     double value;
    12 };
    13 Edge edg[MAXM];
    14 int n,edgnum;
    15 queue<int>dl;
    16 void initial(){
    17     memset(dis,0,sizeof(dis));
    18     memset(vis,0,sizeof(vis));
    19     while(!dl.empty())dl.pop();
    20 }
    21 void add(int u,int v,double value){
    22     Edge E;
    23     E.from=u;E.to=v;E.value=value;E.next=head[u];
    24     edg[edgnum]=E;
    25     head[u]=edgnum++;
    26 }
    27 void SPFA(int sx){
    28     initial();
    29     dis[sx]=1;
    30     vis[sx]=1;
    31     dl.push(sx);
    32     while(!dl.empty()){
    33         int k=dl.front();
    34         dl.pop();
    35         vis[k]=0;
    36         for(int i=head[k];i!=-1;i=edg[i].next){
    37             int v=edg[i].to;
    38             if(dis[k]*edg[i].value>dis[v]){
    39                 dis[v]=dis[k]*edg[i].value;
    40                 if(!vis[v])
    41                     dl.push(v),vis[v]=1;
    42             }
    43         }
    44     }
    45 }
    46 int main(){
    47     int a,b,Q;
    48     double v;
    49     while(~scanf("%d",&n)){
    50         memset(head,-1,sizeof(head));
    51         edgnum=0;
    52         for(int i=1;i<=n;i++)
    53         for(int j=1;j<=n;j++){
    54             scanf("%lf",&v);
    55             add(i,j,v);
    56         }
    57         scanf("%d",&Q);
    58         while(Q--){
    59             scanf("%d%d",&a,&b);
    60             SPFA(a);
    61             if(dis[b]==0.0)puts("What a pity!");
    62             else printf("%.3lf
    ",dis[b]);
    63         }
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    Codeforces 235C Cyclical Quest 后缀自动机
    HDU-6583 Typewriter 后缀自动机+dp
    HDU-4436 str2int 后缀自动机
    [题解]诸侯安置(dp+组合)
    [题解]洛谷P1350车的放置
    二进制表示中1的个数与异或关系
    [洛谷P1593][POJ-1845Sumdiv] 因子和
    [USACO08DEC]拍头Patting Heads 题解
    [小白逛公园]|[SP1716]|[UVA1400]解题报告(三合一)
    P2034选择数字题解
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4737550.html
Copyright © 2011-2022 走看看