zoukankan      html  css  js  c++  java
  • bzoj 1415: [Noi2005]聪聪和可可

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     6 #define pa pair<int,int>
     7 #define M 1008
     8 #define inf 100000000
     9 using namespace std;
    10 int cnt,mark[M][M],b[M],dis[M][M],n,m,head[M],next[M*M],u[M*M],s,t;
    11 double f[M][M];
    12 void jia(int a1,int a2)
    13 {
    14     cnt++;
    15     next[cnt]=head[a1];
    16     head[a1]=cnt;
    17     u[cnt]=a2;
    18     return;
    19 }
    20 int zou(int s,int t)
    21 {
    22     int k=inf,k1=-1;
    23     for(int i=head[s];i;i=next[i])
    24       if(k>dis[u[i]][t]||(k==dis[u[i]][t]&&k1>u[i]))
    25         {
    26             k=dis[u[i]][t];
    27             k1=u[i];
    28         }
    29     return k1;
    30 }
    31 double zhao(int s,int t)
    32 {
    33     int tot=1,s1=s;
    34     double q=0;
    35     if(mark[s][t])
    36       return f[s][t];
    37     if(s==t)
    38       return 0;
    39     for(int i=1;i<3;i++)
    40       {
    41         s=zou(s,t);
    42         if(s==t)
    43           {
    44             f[s1][t]=1;
    45             return f[s1][t];
    46           }
    47       }
    48     q+=zhao(s,t);
    49     for(int i=head[t];i;i=next[i]) 
    50       {
    51         q+=zhao(s,u[i]);
    52         tot++;
    53       }
    54     mark[s1][t]=1;
    55     f[s1][t]=q/(1.0*tot)+1;
    56     return f[s1][t];
    57 }
    58 int main()
    59 {
    60     scanf("%d%d%d%d",&n,&m,&s,&t);
    61     for(int i=1;i<=m;i++)
    62       {
    63         int a1,a2;
    64         scanf("%d%d",&a1,&a2);
    65         jia(a1,a2);
    66         jia(a2,a1);
    67       }
    68     for(int i=1;i<=n;i++)
    69       {
    70         for(int j=1;j<=n;j++)
    71           dis[i][j]=inf;
    72         dis[i][i]=0;
    73         memset(b,0,sizeof(b));
    74         priority_queue<pa,vector<pa>,greater<pa> >q;
    75         q.push(make_pair(0,i));
    76         for(;!q.empty();)
    77           {
    78                 int p=q.top().second;
    79                 q.pop();
    80                 if(b[p])
    81                   continue;
    82                 b[p]=1;
    83                 for(int j=head[p];j;j=next[j])
    84                   if(dis[i][u[j]]>dis[i][p]+1)
    85                     {
    86                         dis[i][u[j]]=dis[i][p]+1;
    87                         q.push(make_pair(dis[i][u[j]],u[j]));
    88                     }
    89           }   
    90       }
    91     printf("%.3lf",zhao(s,t));
    92     return 0;
    93 }

    概率性dp,但首先要用nlogn的dj预处理出两点之间的距离,然后就是一个简单的概率性dp

  • 相关阅读:
    mysql数据库(12)--进阶二之索引
    mysql数据库(11)--进阶一之join
    mysql数据库(10)--变量、存储过程和函数
    mysql数据库(9)--视图
    mysql数据库(10)--limit与offset的用法
    前端常用在线引用地址
    SQL中ON和WHERE的区别
    jstl和e1
    解决中文乱码问题
    JSP
  • 原文地址:https://www.cnblogs.com/xydddd/p/5271171.html
Copyright © 2011-2022 走看看