题目pdf:http://acm.bnu.edu.cn/v3/external/124/12487.pdf

大致题意:

一棵树,一个人从A节点出发,等可能的选不论什么一条边走,有两个节点B,C求这个人先到达B的概率

思路:

先说结论:仅仅和离A的距离有关。先到达B+先到达A的概率 = 1,然后依据距离分配一下就好。

构造性证明:假设B-A-C在一条链上显然就是按距离分配概率。由于链上的支路对概率一点影响没有,由于假如走到支路上。你会发现,原本仅仅是向前向后各1/2的概率如今不变成1/3了吗,并非,一条链上的点往C或往B走的概率事实上永远都是1/2,由于走到支路以后还要考虑这部分最后对概率的贡献,所以它必定会回到原链上。这部分可能性任然会各一半的分流到B或C或其它支路方向,终于等于没有支路,所以假设B-A-C在一条链上显然就是按距离分配概率

若不在一条链上,以A为根,A点始终要到达LCA(B,C) ,如今又变成了一条链了,结论仍成立。

标解是,dp[x]是从x点出发先到达B的概率。显然有dp[B] = 1,dp[C] = 0.

dp[u] = sum(dp[v])/cnt(相邻的节点数),能够列线性方程,然后高斯消元解得dp[A]

这样效率就大大减少了

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <ctime>
#include <bitset>
#include <algorithm>
#define SZ(x) ((int)(x).size())
#define ALL(v) (v).begin(), (v).end()
#define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i)
#define reveach(i, v) for (__typeof((v).rbegin()) i = (v).rbegin(); i != (v).rend(); ++ i)
#define REP(i,n) for ( int i=1; i<=int(n); i++ )
#define rep(i,n) for ( int i=0; i< int(n); i++ )
using namespace std;
typedef long long ll;
#define X first
#define Y second
typedef pair<int,int> pii;
template <class T>
inline bool RD(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF) return 0;
while (c != '-' && (c<'0' || c>'9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
template <class T>
inline void PT(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) PT(x / 10);
putchar(x % 10 + '0');
}
const int N = 233;
int n,A,B,C;
vector<int> G[N]; int dep[N];
bool vis[N];
int pa[N][20];
void BFS(int root)
{
memset(vis,0,sizeof(vis));
dep[root] = 0;
queue<int>q;
q.push(root);
pa[root][0] = root;
vis[root] = 1;
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i=1;i<20;i++) pa[u][i] = pa[pa[u][i-1]][i-1];
foreach(it,G[u])
{
int v = *it;
if(vis[v] == 0)
{
vis[v] = 1;
pa[v][0] = u;
dep[v] = dep[u]+1;
q.push(v);
}
}
}
}
int LCA(int u,int v)
{
if(dep[u] > dep[v]) swap(u,v);
for(int det = dep[v]-dep[u],i = 0;det;i++,det >>= 1)
if(det&1) v=pa[v][i];
if(v == u) return v;
for(int i = 20-1;i >= 0;i--)
if(pa[u][i] != pa[v][i]) v = pa[v][i],u = pa[u][i];
return pa[u][0];
} int main(){ while(scanf("%d%d%d%d",&n,&A,&B,&C) == 4){
REP(i,n) G[i].clear();
REP(i,n-1){
int u,v;
RD(u),RD(v);
G[u].push_back(v);
G[v].push_back(u);
}
BFS(A);
int lca = LCA(B,C);
int db = dep[B]-dep[lca];
int dc = dep[C]-dep[lca];
double ans = 0;
if( db == 0) ans = 1;
else if( dc == 0) ans = 0;
else ans = dc/(double)(db+dc);
printf("%lf\n",ans);
}
}

UVA 12487 Midnight Cowboy(LCA+大YY)(好题)的更多相关文章

  1. UVA - 12487 Midnight Cowboy(LCA+思维)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. UVA.11384 Help is needed for Dexter (思维题)

    UVA.11384 Help is needed for Dexter (思维题) 题意分析 同样水题一道,这回思路对了. 给出数字n,面对一个1,2,3,4--n的数字序列,你可以对他们的部分或者全 ...

  3. URAL 1614. National Project “Trams” (图论大YY)

    1614. National Project "Trams" Time limit: 0.5 second Memory limit: 64 MB President has de ...

  4. UVA 11354 Bond 最小生成树 + lca

    题意 给出一张图,q个询问,每次询问给出uv,找出一条路径,使这条路径上的最大边权是两点所有路径中最小,输出这个值 思路 很显然要先求出最小生成树,任意两点在最小生成树上有唯一路径,并且这条路径上的最 ...

  5. UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

    大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵 ...

  6. UVA 1596 Bug Hunt (大模拟 栈)

    题意: 输入并模拟执行一段程序,输出第一个bug所在的行. 每行程序有两种可能: 数组定义: 格式为arr[size]. 例如a[10]或者b[5],可用下标分别是0-9和0-4.定义之后所有元素均为 ...

  7. UVA 11389 The Bus Driver Problem 贪心水题

    题目链接:UVA - 11389 题意描述:有n个司机,n个早班路线和n个晚班路线,给每个司机安排一个早班路线和一个晚班路线,使得每个早班路线和晚班路线只属于一个司机.如果一个司机早班和晚班总的驾驶时 ...

  8. 【BZOJ-3712】Fiolki LCA + 倍增 (idea题)

    3712: [PA2014]Fiolki Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 303  Solved: 67[Submit][Status] ...

  9. UVA 558 判定负环,spfa模板题

    1.UVA 558 Wormholes 2.总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了..难道next还是特殊词吗 题意:科学家, ...

随机推荐

  1. Javascript和JQuery之间的联系

    一.Js对象和Jquery对象之间的相互转化1.Js对象转化为Jquery对象 var p = document.getElementById('p'); var $obj = $(p); 2.Jqu ...

  2. type与instance区别

    class Foo(object): pass class Bar(Foo): pass obj = Bar() # isinstance用于判断,对象是否是指定类或其派生类的实例 print(isi ...

  3. xml javascript

    1.XMLHttpRequest对象 创建XMLHttpRequest对象 xmlhttp=new XMLHttpRequest(); ##老版本的 Internet Explorer (IE5 和 ...

  4. 02-c#基础之01-基础语法(三)

    1.赋值运算符:"=" =:表示赋值的意思,表示把等号右边的值,赋值给等号左边的变量. 由等号连接的表达式称之为赋值表达式. 注意:每个表达式我们都可以求解除一个定值,对于赋值表达 ...

  5. Atcoder681 Typical DP Contest E.数 数位dp

    写什么递归....非递归多好写 令$f[i][j]$表示前$i$位的和在模$d$意义下为$j$的方案数,然后转移即可 复杂度$O(10000 * 100 * 10)$ 注意非递归建议高位摆第$n$位. ...

  6. 2017 ACM Amman Collegiate Programming Contest

    A - Watching TV /* 题意:求出出现次数最多的数字 */ #include <cstdio> #include <algorithm> #include < ...

  7. [xsy2913]enos

    题意:一棵树,点有$0,1,2$三种颜色,支持路径修改颜色和查询点所在同色连通块的大小 lcm太可怕了,于是去问了sk,得到一个优质做法 考虑lct维护子树信息,$vs_{x,i}$为$x$的虚儿子中 ...

  8. Lua脚本

    应用场景: 游戏开发 独立应用脚本 Web 应用脚本 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench 安全系统,如入侵检测系统 1. 在很多时候,我们可以将Lua直接嵌 ...

  9. CDOJ 42/BZOJ 2753 滑雪与时间胶囊 kruskal

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1376  Solved: 487[Submit][St ...

  10. addEventListener 的一些好方法 简单粗暴的说给你

    function show(){ document.addEventListener("click",fn,{ "passive":false, "c ...