UVA 12487 Midnight Cowboy(LCA+大YY)(好题)
题目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)(好题)的更多相关文章
- UVA - 12487 Midnight Cowboy(LCA+思维)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA.11384 Help is needed for Dexter (思维题)
UVA.11384 Help is needed for Dexter (思维题) 题意分析 同样水题一道,这回思路对了. 给出数字n,面对一个1,2,3,4--n的数字序列,你可以对他们的部分或者全 ...
- URAL 1614. National Project “Trams” (图论大YY)
1614. National Project "Trams" Time limit: 0.5 second Memory limit: 64 MB President has de ...
- UVA 11354 Bond 最小生成树 + lca
题意 给出一张图,q个询问,每次询问给出uv,找出一条路径,使这条路径上的最大边权是两点所有路径中最小,输出这个值 思路 很显然要先求出最小生成树,任意两点在最小生成树上有唯一路径,并且这条路径上的最 ...
- 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]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵 ...
- UVA 1596 Bug Hunt (大模拟 栈)
题意: 输入并模拟执行一段程序,输出第一个bug所在的行. 每行程序有两种可能: 数组定义: 格式为arr[size]. 例如a[10]或者b[5],可用下标分别是0-9和0-4.定义之后所有元素均为 ...
- UVA 11389 The Bus Driver Problem 贪心水题
题目链接:UVA - 11389 题意描述:有n个司机,n个早班路线和n个晚班路线,给每个司机安排一个早班路线和一个晚班路线,使得每个早班路线和晚班路线只属于一个司机.如果一个司机早班和晚班总的驾驶时 ...
- 【BZOJ-3712】Fiolki LCA + 倍增 (idea题)
3712: [PA2014]Fiolki Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 303 Solved: 67[Submit][Status] ...
- UVA 558 判定负环,spfa模板题
1.UVA 558 Wormholes 2.总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了..难道next还是特殊词吗 题意:科学家, ...
随机推荐
- CentOS7启动流程
同样我也找了一张CentOS7的启动流程图. 第一步.硬件启动阶段 这一步和CentOS6差不多,详细请看CentOS6启动流程(含详细流程图) 第二步.GRUB2引导阶段 从这一步开始,CentOS ...
- sublime text3安装Package Control和Vue Syntax Highlight
一.下载Sublime3 https://www.sublimetext.com/3 二.安装Package Control 在线安装: https://packagecontrol.io/insta ...
- django项目添加新的app
- android 数据存储方式
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 1,文件 2,内容提供者 3,偏好设置 4,数据库 5,网络存储. 网络存储,就是上传到 ...
- 使用Java创建Excel,并添加内容
使用Java创建Excel,并添加内容 一.依赖的Jar包 jxl.jar,使用jxl操作Excel Jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Ex ...
- ARC 067 E - Grouping
题面在这里! 很显然是个暴力dp. 我们先枚举一下 队伍人数的种类,然后再逆序枚举一下dp数组里的总人数(顺序就会算重),最后枚举一下这种队伍的数量,之后就可以O(1)算方案了. 具体的,O(1)算方 ...
- 【dijkstra优化/次短路径】POJ3255-Roadblocks
[题目大意] 给出一张无向图,求出从源点到终点的次短边. [思路] 先来谈谈Dijkstra的优化.对于每次寻找到当前为访问过的点中距离最短的那一个,运用优先队列进行优化,避免全部扫描,每更新一个点的 ...
- Complete list of APDU responses
https://www.eftlab.com.au/index.php/site-map/knowledge-base/118-apdu-response-list List of APDU resp ...
- JTAG/SPI/ISP/ICSP 接口电路
- 七问C#关键字const和readonly
const和readonly经常被用来修饰类的字段,两者有何异同呢? const 1.声明const类型变量一定要赋初值吗? --一定要赋初值 public class Student { publi ...