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还是特殊词吗 题意:科学家, ...
随机推荐
- Web应用扫描工具Wapiti
Web应用扫描工具Wapiti Wapiti是Kali Linux预置的一款Web应用扫描工具.该工具执行黑盒扫描,用户只需要输入要扫描的网址即可.该工具可以探测文件包含.数据库注入.XSS.CR ...
- 支撑大规模公有云的Kubernetes改进与优化 (3)
这一篇我们来讲网易为支撑大规模公有云对于Kubernetes的定制化. 一.总体架构 网易的Kubernetes集群是基于网易云IaaS平台OpenStack上面进行部署的,在外面封装了一个容器平台的 ...
- MongoDB复制原理
##mongodb复制(主从服务器数据备份, 一个主服务器可以有很多个从服务器) #mongodb的复制至少需要两个节点.其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据 ...
- opencv 加载 修改 保存 图像
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; /* 1 加载图像 cv::imre ...
- django使用admin
1.在应用下的admin.py添加 #!/usr/bin/python # coding:utf-8 from django.contrib import admin from .models imp ...
- Redis 服务器命令
1.BGREWRITEAOF 异步执行一个 AOF(AppendOnly File) 文件重写操作 2.BGSAVE 在后台异步保存当前数据库的数据到磁盘 3.CLIENT KILL [ip:port ...
- 1265. [NOIP2012] 同余方程
1265. [NOIP2012] 同余方程 ★☆ 输入文件:mod.in 输出文件:mod.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 求关于 x 的同余 ...
- 第一章--Go与web应用
Go语言构建web应用的特性 可扩展 可维护 模块化 高性能 HTTP简介 HTTP是一种无状态.由文本构成的请求-响应(request-response)协议,这种协议使用的是客户端-服务器(cli ...
- 使用HAproxy如何实现web站点的动静分离
HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别 适用于那些负载特大的web站点,这些站点通常 ...
- 不错的SDL源码分析
SDL源码分析 1:初始化(SDL_Init()) 2:窗口(SDL_Window) 3:渲染器(SDL_Renderer) 4:纹理(SDL_Texture) 5:更新纹理(SDL_UpdateT ...