您的位置:首页 > 其它

【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

2017-04-22 08:51 337 查看

1415: [Noi2005]聪聪和可可

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1640 Solved: 962

Description

1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 #include<queue>
7 using namespace std;
8 #define Maxn 1010
9 #define Maxm 1010
10
11 int mymin(int x,int y) {return x<y?x:y;}
12
13 struct node
14 {
15     int x,y,next;
16 }t[Maxm*2];
17 int first[Maxn],len;
18 int d[Maxn];
19
20 void ins(int x,int y)
21 {
22     t[++len].x=x;t[len].y=y;
23     t[len].next=first[x];first[x]=len;
24     d[x]++;
25 }
26
27 int n,m;
28 int dis[Maxn][Maxn],pre[Maxn],wk[Maxn][Maxn];
29 queue<int > q;
30 void bfs(int nw)
31 {
32     for(int i=1;i<=n;i++) dis[nw][i]=-1;
33     while(!q.empty()) q.pop();
34     dis[nw][nw]=0;q.push(nw);
35     while(!q.empty())
36     {
37         int x=q.front();q.pop();
38         for(int i=first[x];i;i=t[i].next)
39         {
40             int y=t[i].y;
41             if(dis[nw][y]!=-1&&dis[nw][x]+1==dis[nw][y]) pre[y]=mymin(pre[y],x);
42             else if(dis[nw][y]==-1)
43             {
44                 dis[nw][y]=dis[nw][x]+1;
45                 pre[y]=x;
46                 q.push(y);
47             }
48         }
49     }
50     for(int i=1;i<=n;i++) wk[i][nw]=pre[i];
51 }
52
53 double f[Maxn][Maxn];
54 bool vis[Maxn][Maxn];
55
56 double ffind(int st,int ed)
57 {
58     if(st==ed) return f[st][ed]=0;
59     if(dis[st][ed]<=2) return f[st][ed]=1.0;
60     if(vis[st][ed]) return f[st][ed];
61     f[st][ed]=0;vis[st][ed]=1;
62     int to=wk[wk[st][ed]][ed];
63     for(int i=first[ed];i;i=t[i].next)
64     {
65         int y=t[i].y;
66         f[st][ed]+=(ffind(to,y)+1)*1.0/(d[ed]+1);
67     }
68     f[st][ed]+=(ffind(to,ed)+1)*1.0/(d[ed]+1);
69     return f[st][ed];
70 }
71
72 int main()
73 {
74     int st,ed;
75     scanf("%d%d%d%d",&n,&m,&st,&ed);
76     len=0;
77     memset(first,0,sizeof(first));
78     for(int i=1;i<=m;i++)
79     {
80         int x,y;
81         scanf("%d%d",&x,&y);
82         ins(x,y);ins(y,x);
83     }
84     for(int i=1;i<=n;i++) bfs(i);
85     memset(vis,0,sizeof(vis));
86     ffind(st,ed);
87     printf("%.3lf\n",f[st][ed]);
88     return 0;
89 }


View Code
2017-04-22 08:51:55
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: