题意:

给出一个有向无环图,从 111 号点向 nnn 号点前进。每次等概率地转移到后继节点,也有可能留在当前节点。定义每一天的花费是当前走过的天数,即第 iii 天的花费是 iii,求从起点走到终点的总花费。(2≤n≤105,1≤m≤2∗105)(2\leq n\leq 10^5,1\leq m\leq 2*10^5)(2≤n≤105,1≤m≤2∗105)


思路:

令 day[i]day[i]day[i] 表示从第 iii 个点到达第 nnn 个点的期望天数,cost[i]cost[i]cost[i] 表示从第 iii 个点到达第 nnn 个点的期望花费,deg[i]deg[i]deg[i] 表示第 iii 个点的出度。

day[i]=∑j∈deg[i]day[j]deg[i]+1+day[i]deg[i]+1+1day[i]=∑j∈deg[i]day[j]deg[i]+deg[i]+1deg[i]day[i] = \sum\limits_{j\in deg[i]}\frac{day[j]}{deg[i]+1}\ +\ \frac{day[i]}{deg[i]+1} \ +\ 1 \\ \\ day[i] = \sum\limits_{j\in deg[i]}\frac{day[j]}{deg[i]}\ +\ \frac{deg[i]+1}{deg[i]} \\ day[i]=j∈deg[i]∑​deg[i]+1day[j]​ + deg[i]+1day[i]​ + 1day[i]=j∈deg[i]∑​deg[i]day[j]​ + deg[i]deg[i]+1​

然后再来求取 cost[i]cost[i]cost[i]。
cost[i]=∑j∈deg[i]cost[j]deg[i]+1+cost[i]deg[i]+1+day[i]cost[i]=∑j∈deg[i]cost[j]deg[i]+deg[i]∗(deg[i]+1)deg[i]cost[i] = \sum\limits_{j\in deg[i]}\frac{cost[j]}{deg[i]+1}\ +\ \frac{cost[i]}{deg[i]+1} \ +\ day[i] \\ \\ cost[i] = \sum\limits_{j\in deg[i]}\frac{cost[j]}{deg[i]}\ +\ \frac{deg[i]*(deg[i]+1)}{deg[i]} \\ cost[i]=j∈deg[i]∑​deg[i]+1cost[j]​ + deg[i]+1cost[i]​ + day[i]cost[i]=j∈deg[i]∑​deg[i]cost[j]​ + deg[i]deg[i]∗(deg[i]+1)​

为什么求 cost[i]cost[i]cost[i] 的最后要加上一个 day[i]day[i]day[i],因为当前之后还有 day[i]−1day[i]-1day[i]−1 天,每天的期望要加上一个 111,即当前走的这一步。因此 day[i]−1+1=day[i]day[i]-1+1=day[i]day[i]−1+1=day[i]。

接下来就是把边反向跑拓扑序转移即可。


总结:

概率 dpdpdp 题目,主要难点在于考虑清所有的情况,精准地列出式子。

有时最终的式子也有可能由多个式子组成,需要求出多个变量,需要对问题进行一定的拆分。


代码:

#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof a);
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define per(i,a,b) for(int i = a; i >= b; i--)
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
typedef long long ll;
typedef double db;
const int N = 4e5+100;
const int M = 5e5+100;
const db EPS = 1e-9;
using namespace std;void dbg() {cout << "\n";}
template<typename T, typename... A> void dbg(T a, A... x) {cout << a << ' '; dbg(x...);}
#define logs(x...) {cout << #x << " -> "; dbg(x);}int n,m,tot,head[N],deg[N],base[N];
db day[N],cost[N];
struct Node{int to,next;
}e[M];void add(int x,int y){e[++tot].to = y, e[tot].next = head[x], head[x] = tot;
}void init(){tot = 1;rep(i,0,n){head[i] = deg[i] = 0;day[i] = cost[i] = 0;}
}void solve(){queue<int> q;while(q.size()) q.pop();rep(i,1,n) base[i] = deg[i];rep(i,1,n)if(!deg[i]) q.push(i);while(q.size()){int x = q.front(); q.pop();if(base[x] != 0){day[x] += (db)(base[x]+1)/(db)base[x];cost[x] += ((db)day[x]*(db)(base[x]+1))/(db)base[x];}for(int i = head[x]; i; i = e[i].next){int y = e[i].to;deg[y]--;day[y] += (db)day[x]/(db)base[y];cost[y] += (db)cost[x]/(db)base[y];if(!deg[y]) q.push(y);}}printf("%.2f\n",cost[1]);
}int main()
{int _; scanf("%d",&_);while(_--){scanf("%d%d",&n,&m);init();rep(i,1,m){int u,v; scanf("%d%d",&u,&v);deg[u]++; add(v,u);}solve();}return 0;
}

【2019南京ICPC网络赛 D】Robots【DAG上的随机游走】相关推荐

  1. Greedy Sequence(2019南京icpc网络预选赛)主席树求区间小于k的最大值

    题意:给出n个整数,构造s1,s2,s3-sn s1,s2,s3-sns1,s2,s3-sn,si sisi满足五个条件 1.s1[i]=i s1[i]=is1[i]=i 2.对于1<j< ...

  2. New Year and Old Subsequence CodeForces - 750E(线段树+矩阵dp)2019南昌icpc网络赛Hello 2019

    A string t is called nice if a string "2017" occurs in t as a subsequence but a string &qu ...

  3. so easy(2019徐州icpc网络赛B)

    题目链接:题目链接 当时这个题卡了好久,用了两个map一直超时. 一直想用并查集,但是一直想不出来怎么用.赛后问的lzh大佬才知道的. map+并查集. 1操作的时候,就把这个值的map设置为x+1. ...

  4. 2019 徐州icpc网络赛 E. XKC's basketball team

    题库链接: https://nanti.jisuanke.com/t/41387 题目大意 给定n个数,与一个数m,求ai右边最后一个至少比ai大m的数与这个数之间有多少个数 思路 对于每一个数,利用 ...

  5. Peekaboo(2019年上海网络赛K题+圆上整点)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 你的位置在\(O(0,0)\),\(A\)的位置为\((x_1,y_1)\),\(B\)的位置为\((x_2,y_2)\),现在已知\(a=O ...

  6. KDD 2019 | 结合属性随机游走的图递归网络

    今天给大家介绍德克萨斯A&M大学的Xiao Huang等人在KDD 2019发表的一篇文章"Graph Recurrent Networks with Attributed Rand ...

  7. 带属性随机游走的图循环网络

    1. 背景     随机游走模型被广泛应用于从网络嵌入到标签传播的各种网络分析任务中.但是在真实的系统中,节点通常不是纯顶点,而是具有不同的特征.然而,为具有属性的网络开发随机游走模型是困难的,节点属 ...

  8. Factories Gym - 102222G(2018宁夏邀请赛暨2019银川icpc网络预选赛)

    第一场icpc网络赛,出的去年宁夏邀请赛原题.c题还没有读完就有ak的了..(滑稽) Byteland has nn cities numbered from 11 to nn, and n−1n−1 ...

  9. ICPC网络赛第二场G Limit

    ICPC网络赛第二场G Limit 题意: 给你数组a和b,求解: 1≤n≤100000,−100≤ai,bi≤100,0≤t≤5.1≤n≤100000,−100≤a_{i},b_{i}≤100,0≤ ...

  10. icpc网络赛第二场K Meal

    icpc网络赛第二场K Meal 题意: 有n个人,n个菜, 现在n个人轮流吃菜,起初S中有n个菜,第i个人会在还没拿走的菜中随机选一个,拿走第j个菜的概率为ai,j∑k∈Sai,k\frac{a_{ ...

最新文章

  1. HIVE QL 杂记
  2. 洛谷P3960 列队(Splay)
  3. 大众正式发布ID. Buzz 造型致敬经典
  4. 【渝粤教育】电大中专药物分析技术基础 (2)_1作业 题库
  5. 举例说明jquery插件的编写方法
  6. SCHNOKA施努卡:扁线电机定子生产过程中线圈插入
  7. 【DIY】热水器升级加装远程wifi控制功能,esp8266远程红外控制热水器启动
  8. 彻底卸载CAD或者其他任何软件、删除注册表的神奇-YourUninstallerPortable.exe
  9. java创新创业比赛项目教程_基于JavaWeb的计算机创新创业平台的功能设计与实现...
  10. 手把手带你撸一个校园APP(一):项目简介
  11. 2014年总结和2015年的规划
  12. 多多参谋:拼多多推广怎么出价?该怎么做好推广?
  13. 苹果app退款_苹果上最流氓的功能,终于被彻底关掉,还退款208元
  14. 一位码农的憧憬与迷茫
  15. 人脸识别之人脸关键点(仅供本人参考)
  16. 进阶实验 2-3.1 海盗分赃(25 分)
  17. php判断关联数组为空,php 关联数组判断是否为空
  18. 小米盒子4S Pro好不好,对比当贝盒子B1有什么缺点
  19. 微信小程序复制文本方法
  20. 【日语】【歌词】「ヤキモチ」--高橋優

热门文章

  1. 学习之路二十七:三种序列化方式的一些注意点
  2. java中重写和重载的区别
  3. wordpress配置邮箱发送功能
  4. sql将null替换为0_Firefox浏览器将被认为包含歧视性的 Master字眼替换为 Primary
  5. 【牛客小白赛12:J/2019南昌网络赛:M/牛客练习赛23:D】查询字符串ss是否是字符串s的子序列(序列自动机裸题)
  6. 【UVA1339】古老的密码(巧妙思路+(q)sort降序排列的三种方法)
  7. 职称英语职称计算机如何折算为学时,职称英语成绩可折算学时 或成考试新方向...
  8. codeblocks同一工程下建立多个源文件
  9. 鸿蒙安卓生态已经非常完善,鸿蒙前进一小步,生态却完善一大步,解决了替换安卓的第一个问题...
  10. android65535错误实现,Android 65535问题的解决方法