BZOJ 1415: [Noi2005]聪聪和可可
2017-02-27 15:36
302 查看
1415: [Noi2005]聪聪和可可
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1528 Solved: 903
[Submit][Status][Discuss]
Description
Input
数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数。 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号。 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路。 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A。 输入保证任何两个景点之间不会有多于一条路直接相连,且聪聪和可可之间必有路直接或间接的相连。Output
输出1个实数,四舍五入保留三位小数,表示平均多少个时间单位后聪聪会把可可吃掉。Sample Input
【输入样例1】4 3
1 4
1 2
2 3
3 4
【输入样例2】
9 9
9 3
1 2
2 3
3 4
4 5
3 6
4 6
4 7
7 8
8 9
Sample Output
【输出样例1】1.500
【输出样例2】
2.167
HINT
【样例说明1】开始时,聪聪和可可分别在景点1和景点4。
第一个时刻,聪聪先走,她向更靠近可可(景点4)的景点走动,走到景点2,然后走到景点3;假定忽略走路所花时间。
可可后走,有两种可能:
第一种是走到景点3,这样聪聪和可可到达同一个景点,可可被吃掉,步数为1,概率为 。
第二种是停在景点4,不被吃掉。概率为 。
到第二个时刻,聪聪向更靠近可可(景点4)的景点走动,只需要走一步即和可可在同一景点。因此这种情况下聪聪会在两步吃掉可可。
所以平均的步数是1* +2* =1.5步。
对于所有的数据,1≤N,E≤1000。
对于50%的数据,1≤N≤50。
Source
[Submit][Status][Discuss]这道SB题调了一上午,就是个DAG的期望DP,连gauss都不用的,随便DP一发就好,就是智障了~~~
#include <cstdio> #include <cstring> template <class T> inline T min(const T &a, const T &b) { return a < b ? a : b; } const int siz = 1005; int n, m; int a, b; int tot; int hd[siz]; int to[siz << 1]; int nt[siz << 1]; int cnt[siz]; int que[siz]; int inq[siz]; int dis[siz]; int mov[siz][siz]; double f[siz][siz]; double search(int x, int y) { if (f[x][y] >= 0.0) return f[x][y]; int t = mov[mov[x][y]][y]; if (t == y) return f[x][y] = 1; f[x][y] = search(t, y); for (int i = hd[y]; i; i = nt[i]) f[x][y] += search(t, to[i]); return f[x][y] = f[x][y] / cnt[y] + 1.0; } signed main(void) { scanf("%d%d", &n, &m); scanf("%d%d", &a, &b); for (int i = 1; i <= m; ++i) { int x, y; scanf("%d%d", &x, &y); ++cnt[x]; ++cnt[y]; nt[++tot] = hd[x], to[tot] = y, hd[x] = tot; nt[++tot] = hd[y], to[tot] = x, hd[y] = tot; } { for (int i = 1; i <= n; ++i) { memset(inq, 0x00, sizeof inq); memset(dis, 0x3f, sizeof dis); int l = 0, r = 0; dis[i] = 0; inq[i] = 1; mov[i][i] = i; for (int j = hd[i]; j; j = nt[j]) inq[to[j]] = dis[que[r++] = mov[i][to[j]] = to[j]] = 1; while (l != r) { int u = que[l++]; for (int j = hd[u]; j; j = nt[j]) { if (!inq[to[j]]) inq[que[r++] = to[j]] = 1; if (dis[to[j]] > dis[u] + 1) dis[to[j]] = dis[u] + 1, mov[i][to[j]] = mov[i][u]; else if (dis[to[j]] == dis[u] + 1) mov[i][to[j]] = min(mov[i][to[j]], mov[i][u]); } } } } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) f[i][j] = -1.0; f[i][i] = 0.0; ++cnt[i]; } printf("%.3lf\n", search(a, b)); }
@Author: YouSiki
相关文章推荐
- 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)
- BZOJ 1415: [Noi2005]聪聪和可可
- BZOJ 1415 CODE[VS] 1784 [NOI2005 D2T2] 聪聪和可可
- BZOJ 1415: [Noi2005]聪聪和可可 概率DP,记忆化搜索,BFS
- bzoj 1415: [Noi2005]聪聪和可可
- bzoj 1415: [Noi2005]聪聪和可可 (概率与期望)
- NOI2005 BZOJ 1415聪聪和可可(期望+Floyd)
- BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】
- BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs
- BZOJ1415 [Noi2005]聪聪和可可
- bzoj1415 [Noi2005]聪聪和可可
- BZOJ 1415: [Noi2005]聪聪和可可
- 【BZOJ1415】【Noi2005】聪聪和可可 概率DP 记忆化搜索
- bzoj1415【NOI2005】聪聪和可可
- bzoj1415 [Noi2005]聪聪和可可
- 【BZOJ1415】【NOI2005】聪聪可可(期望dp、记忆化搜索)
- BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp
- bzoj1415[NOI2005]聪聪和可可-期望的线性性
- BZOJ1415: [Noi2005]聪聪和可可
- BZOJ 1415: [Noi2005]聪聪和可可|概率dp