zoukankan      html  css  js  c++  java
  • 【BZOJ 1415】 [Noi2005]聪聪和可可

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <cstring>
     6 using namespace std;
     7 
     8 int p[1001][1001];
     9 double ans[1001][1001];
    10 int n,m;
    11 int tot,g[1001],nnext[1001*2],num[1001*2];
    12 int team[1000000];
    13 int d[1001];
    14 int head,tail;
    15 bool b[1001];
    16 void Add(int x,int y)
    17 {
    18     tot++;
    19     nnext[tot]=g[x];
    20     g[x]=tot;
    21     num[tot]=y;
    22 }
    23 void SPFA(int t)
    24 {
    25     while(head<tail)
    26     {
    27         int x=team[++head]; b[x]=false;
    28         for(int i=g[x];i;i=nnext[i])
    29         {
    30             int tmp=num[i];
    31             if(d[tmp]>d[x]+1||(d[tmp]==d[x]+1&&x<p[tmp][t]))
    32             {
    33                 d[tmp]=d[x]+1;
    34                 p[tmp][t]=x;
    35                 if(!b[tmp]) 
    36                 {
    37                     team[++tail]=tmp;
    38                     b[tmp]=true;
    39                 }
    40             }
    41         }
    42     }
    43 }
    44 
    45 double DFS(int x,int y)
    46 {
    47 //    cout<< x<<' '<<y<<endl;
    48     
    49     if(x==y) return 0.0;
    50     if(ans[x][y]) return ans[x][y];
    51     if(p[x][y]==y)return 1.0;if(p[p[x][y]][y]==y) return 1.0;
    52     
    53     double aa=0;
    54     int cnt=0;
    55     for(int i=g[y];i;i=nnext[i])
    56         aa+=DFS(p[p[x][y]][y],num[i])+1.0,cnt++;
    57     aa+=DFS(p[p[x][y]][y],y)+1.0;
    58     aa/=(double)(cnt+1);
    59     ans[x][y]=aa;
    60     return ans[x][y];
    61 }
    62 
    63 int main()
    64 {
    65     cin>>n>>m;int s,t;cin>>s>>t;
    66     for(int i=1;i<=m;i++)
    67     {
    68         int x,y;
    69         cin>>x>>y;
    70         Add(x,y);
    71         Add(y,x);
    72     }    
    73         
    74 //    cout<<"fasfa";
    75     
    76     for(int i=1;i<=n;i++)
    77     {
    78         memset(d,63,sizeof(d));
    79         d[i]=0;
    80         head=tail=0;
    81         team[++tail]=i;b[i]=true;
    82         SPFA(i);
    83     }
    84     
    85     //    cout<<endl;
    86     printf("%.3lf ",DFS(s,t));
    87     return 0;
    88 }
  • 相关阅读:
    python 获取时间戳
    【转载】Git分支
    【转载】Jmeter分布式测试
    【总结】异常处理
    【转载】linux-查看日志
    【转载】python中if-else的多种写法
    【转载】Linux中rz和sz命令
    【转载】pip 使用国内源
    wrk(一)
    angular-gridster2使用
  • 原文地址:https://www.cnblogs.com/ofsxb/p/5176800.html
Copyright © 2011-2022 走看看