【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

题面

BZOJ

题解

先预处理出当可可在某个点,聪聪在某个点时
聪聪会往哪里走
然后记忆化搜索一下就好了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1111
inline int read()
{
    RG int x=0,t=1;RG char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1,iv[MAX];
int p[MAX][MAX],dis[MAX];
bool vis[MAX];
int n,m;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;iv[u]++;}
void BFS(int S)
{
    queue<int> Q;Q.push(S);
    memset(vis,0,sizeof(vis));
    vis[S]=true;dis[S]=0;
    while(!Q.empty())
    {
        int u=Q.front();Q.pop();
        for(int i=h[u];i;i=e[i].next)
        {
            if(vis[e[i].v])continue;
            vis[e[i].v]=true;
            dis[e[i].v]=dis[u]+1;
            Q.push(e[i].v);
        }
    }
}
void Pre(int S)
{
    BFS(S);dis[0]=1e9;
    for(int u=1;u<=n;++u)
        for(int i=h[u];i;i=e[i].next)
            if(dis[p[u][S]]>dis[e[i].v]||(dis[p[u][S]]==dis[e[i].v]&&e[i].v<p[u][S]))
                p[u][S]=e[i].v;
    p[S][S]=S;
}
int S,T;
double f[MAX][MAX];
double DFS(int u,int v)
{
    if(f[u][v]!=-1.0)return f[u][v];
    if(u==v)return f[u][v]=0;
    if(p[u][v]==v)return f[u][v]=1.0;
    if(p[p[u][v]][v]==v)return f[u][v]=1.0;
    f[u][v]=0;
    for(int i=h[v];i;i=e[i].next)
        f[u][v]+=DFS(p[p[u][v]][v],e[i].v);
    f[u][v]+=DFS(p[p[u][v]][v],v);
    f[u][v]/=(iv[v]+1);f[u][v]+=1;
    return f[u][v];
}
int main()
{
    n=read();m=read();
    S=read();T=read();
    for(int i=1;i<=m;++i)
    {
        int u=read(),v=read();
        Add(u,v);Add(v,u);
    }
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            f[i][j]=-1;
    for(int i=1;i<=n;++i)Pre(i);
    printf("%.3lf\n",DFS(S,T));
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/8428133.html

时间: 2024-11-10 08:06:56

【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)的相关文章

bzoj1415【NOI2005】聪聪和可可

1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1271  Solved: 748 [Submit][Status][Discuss] Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景

Bzoj1415 [Noi2005]聪聪和可可

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1586  Solved: 929 Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A. 输

【bzoj1415】[Noi2005]聪聪和可可 期望记忆化搜索

题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A. 输入保证任何两个景点之间不会有多于一条路直接相连,且聪聪和可可之间必有路直接或间接的相连. 输出 输出1个实数,四舍五入保留三位小数,表示平均多少个时间单

【BZOJ1415】 [Noi2005]聪聪和可可 概率与期望

其实题不难,不知提交了几次...不能代码MD...注意一些基本问题...SB概率题 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define N 1001 5 using namespace std; 6 double f[N][N]; 7 int n,m,cnt,a,b; 8 struct E{int next,to;}e[2*N+10]; 9 int head[N],ds[N],

【BZOJ】【1415】【NOI2005】聪聪和可可

数学期望+记忆化搜索 论文:<浅析竞赛中一类数学期望问题的解决方法>——汤可因  中的第一题…… Orz 黄学长 我实在是太弱,这么简单都yy不出来…… 宽搜预处理有点spfa的感觉= =凡是更新了的,都要重新入队更新一遍…… dp的记忆化搜索过程好厉害…… 期望这里一直很虚啊,赶紧再多做点题熟悉熟悉…… 1 /************************************************************** 2 Problem: 1415 3 User: Tunix

Vijos1675 NOI2005 聪聪和可可 记忆化搜索

简单题,结果因为理解错题意懵逼了好久…… moveTo[x][y]表示聪聪在节点x,可可在节点y时,聪聪下一步应到达哪一个节点 dp[x][y]表示聪聪在节点x,可可在节点y,且轮到可可行动时,所需时间的数学期望(可可第一次行动不计入其内) 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <queue> 6

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

1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即

【NOI2005】聪聪与可可

P2432 - [NOI2005]聪聪与可可 Description 在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小老鼠可可.虽然灰姑娘非常喜欢她们俩,但是,聪聪终究是一只猫,而可可终究是一只老鼠,同样不变的是,聪聪成天想着要吃掉可可. 一天,聪聪意外得到了一台非常有用的机器,据说是叫GPS,对可可能准确的定位.有了这台机器,聪聪要吃可可就易如反掌了.于是,聪聪准备 马上出发,去找可可.而可怜的可可还不知道大难即将临头,仍在森林里无忧无虑的玩耍.小兔子乖乖听到这件事,马上向灰姑娘报告.灰

【BZOJ】1415 [Noi2005]聪聪和可可

[算法]期望DP,记忆化搜索 题目 [题解]浅析竞赛中一类数学期望问题的解决方法 例题 首先因为聪聪走的步数等于大于可可走的步数,所以不可能出现循环(高斯消元),使DP成为可能. 因为是图显然采用记忆化搜索. p[x][y]表示x走向y第一步编号,f[x][y]表示答案(把答案数组设置出来考虑倒序递推就顺理成章了). e[x][y]表示x的相邻点(代码实现用邻接表),t[x]表示x的度(邻点个数). if(x==y)f[x][y]=0; if(p[p[x][y]][y]==y||p[x][y]=