【CF679D】Bear and Chase 最短路+乱搞
【CF679D】Bear and Chase
题意:近日,鼠国的头号通缉犯,神出鬼没的怪盗——Joker正于摩登市出没!对于名侦探Jack来说,这正是将其捉拿归案的大号时机。形式化地,摩登市可以看成一张 $n$ 个点,$m$ 条边的简单无向连通图。Jack有一个神奇的探测器:MC(Mouse Chaser)。当Jack在某个城市使用MC时,MC会显示Joker所在城市与Jack所在城市之间的距离(即最短路所经过的边数)。Jack只有两天的时间捉拿Joker,具体过程如下:
1.第一天,Joker随机潜伏在某个城市,即Joker位于每个城市的概率都是 $1\over n$ 。Jack将挑选一个城市 $a$ ,在 $a$ 处使用MC,得知Joker所在城市与 $a$ 的距离。然后Jack可以选择立刻调查某个城市:如果Joker正好位于被调查的城市,则Jack成功地将Joker捉拿归案(如果Joker刚好位于城市 $a$ ,那么MC会显示 $0$ ,显然Jack直接调查城市 $a$ 就能直接将Joker捉拿归案);否则,Joker会意识到自己正被追查,从而立刻逃离摩登市,导致Jack的任务直接失败!
2.如果第一天没有立刻调查。那么在夜里,Joker会随机选择一个与Joker所在城市相邻的城市,并前往该城市。即如果有 $d$ 个城市与Joker所在城市相连,则Joker有 $1\over d$ 的概率前往其中的每个城市。
3.第二天,Jack将挑选一个城市 $b$ ,在 $b$ 处使用MC(忽略Jack从 $a$ 前往 $b$ 的时间),得知Joker所在城市与 $b$ 的距离。然后Jack必须选择一个城市进行调查。如果Joker刚好位于被调查的城市,则Jack成功的将Joker捉拿归案;否则,Jack的任务失败。
现在,请你帮助Jack,制定合适的追捕计划,选择前往调查的城市,使得Jack将Joker捉拿归案的概率最大。输出这个最大的概率。
$2\le n\le 400,n-1\le m\le {n(n-1)\over 2},1\le x,y\le n$
题解:先考虑暴力的解法。我们枚举两次使用MC的城市a和b,然后用f[i][j]表示第一天显示i,第二天显示j的概率。我们得到f[i][j]后,用f数组求出g[i]表示第一天在a使用MC显示i的最大概率,进而得到在a使用MC的最大总概率。这样做的复杂度显然是$O(n^4)$的。
但是我们发现,如果我们枚举了第一天可能的位置x,则i=dis[a][x],j只能等于dis[b][x]-1,dis[b][x],dis[b][x]+1。我们可以进行一些预处理,然后复杂度就降到$O(n^3)$了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef double db;
int n,m,now;
int f[410][410],pa[100000],pb[100000],d0[410][410],d1[410][410],d2[410][410],d[410],vis[410][410],cnt[410];
db s0[410][410],s1[410][410],s2[410][410],p[410][410],s[410];
vector<int> v[410];
vector<int>::iterator it;
db tmp,ans;
inline void upd(db &x,db y) {if(x<y) x=y;}
inline void upd(int a,int b,db x)
{
if(a<0) return ;
if(vis[a][b]!=now) vis[a][b]=now,p[a][b]=0,v[a].push_back(b);
upd(p[a][b],x);
}
int main()
{
scanf("%d%d",&n,&m);
memset(f,0x3f,sizeof(f));
int i,j,k,a,b;
for(i=1;i<=n;i++) f[i][i]=0;
for(i=1;i<=m;i++) scanf("%d%d",&a,&b),pa[i]=a,pb[i]=b,d[a]++,d[b]++,f[a][b]=f[b][a]=1;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++) for(j=1;j<=n;j++) f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(f[i][pb[j]]==f[i][pa[j]]+1) s1[i][pa[j]]+=1.0/n/d[pb[j]],s2[i][pb[j]]+=1.0/n/d[pa[j]];
if(f[i][pa[j]]==f[i][pb[j]]+1) s1[i][pb[j]]+=1.0/n/d[pa[j]],s2[i][pa[j]]+=1.0/n/d[pb[j]];
if(f[i][pa[j]]==f[i][pb[j]]) s0[i][pa[j]]+=1.0/n/d[pb[j]],s0[i][pb[j]]+=1.0/n/d[pa[j]];
}
}
for(i=1;i<=n;i++)
{
memset(cnt,0,sizeof(cnt)),memset(s,0,sizeof(s));
for(j=1;j<=n;j++) cnt[f[i][j]]++;
for(j=0;j<=n;j++) if(cnt[j]) s[j]=1.0/n;
for(j=1;j<=n;j++)
{
now++;
for(k=1;k<=n;k++)
{
upd(f[i][k],f[j][k],s0[i][k]);
upd(f[i][k]+1,f[j][k],s1[i][k]);
upd(f[i][k]-1,f[j][k],s2[i][k]);
}
for(k=0;k<=n;k++)
{
tmp=0;
for(it=v[k].begin();it!=v[k].end();it++) tmp+=p[k][*it];
v[k].clear();
upd(s[k],tmp);
}
}
tmp=0;
for(j=0;j<=n;j++) tmp+=s[j];
ans=max(ans,tmp);
}
printf("%.12lf",ans);
return 0;
}//6 14 1 6 2 6 3 6 4 6 5 6 1 5 2 5 3 5 4 5 2 4 3 4 1 3 2 3 1 2
【CF679D】Bear and Chase 最短路+乱搞的更多相关文章
- 洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 && 乱搞
题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...
- P5304 [GXOI/GZOI2019]旅行者(最短路/乱搞)
luogu bzoj Orz自己想出神仙正解的sxy 描述略 直接把所有起点推进去跑dijkstra... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之 ...
- codeforces 653C C. Bear and Up-Down(乱搞题)
题目链接: C. Bear and Up-Down time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- 【51nod1443】路径和树(堆优化dijkstra乱搞)
点此看题面 大致题意:给你一个无向联通图,要求你求出这张图中从u开始的权值和最小的最短路径树的权值之和. 什么是最短路径树? 从\(u\)开始到任意点的最短路径与在原图中相比不变. 题解 既然要求最短 ...
- dij-spfa乱搞
以前见过一篇另类堆优化dij的题解,然而找不到了 那位作者称它为dij-spfa(大概是这个意思,然而确实很形象 这方法比较玄学,正确性没有严格证出来,然而对拍是验证猜想的最好途径 不过也可能并不玄学 ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)
4692: Beautiful Spacing Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 46 Solved: 21[Submit][Statu ...
随机推荐
- python测试开发django-45.xadmin添加小组件报错解决
前言 xadmin首页上有个添加小组件按钮,打开的时候会报错"render() got an unexpected keyword argument 'renderer'" 环境: ...
- Android 热修复方案Tinker(一) Application改造
基于Tinker V1.7.5 Android 热修复方案Tinker(一) Application改造 Android 热修复方案Tinker(二) 补丁加载流程 Android 热修复 ...
- Linux中安装绿色软件的方法
一.简介 我们平时安装软件时,想要把一个可直接运行的软件及其依赖库Copy到Linux中的某个文件夹下.但是为了快速方便地执行它,不想每次都进入此目录中执行.解决的方法是向PATH中相关的路径下投放软 ...
- Kafka的安装和设置
Kafka是一种分布式发布订阅消息系统. Kafka有三种模式: (1)单节点单Broker,在一台机器上运行一个Kafka实例: (2)单节点多Broker,在一台机器上运行多个Kafka实例: ( ...
- 【转】《iOS7 by Tutorials》系列:iOS7的设计精髓(下)
四.聚焦于内容 在iOS7里,强调的不是眼花缭乱的装饰效果,而是最重要的内容本身. 下面我们来探讨这个主题: 1.删除不必要的内容 伟大的设计更多是减法和加法的组合. 虽然很酷的想法是很重要,但还有更 ...
- FDMB 增删改删 查 分页 封装
下载地址 http://pan.baidu.com/s/1qWrt9W4// // GCB_ProductDetailDB.h // TestDemo001 // // Created by Walt ...
- Ubuntu菜鸟入门(十八)————解决Ubuntu下Sublime Text 3无法输入中文
一.下载我们需要的文件,打开终端,输入: git clone https://github.com/lyfeyaj/sublime-text-imfix.git 二.将subl移动到/usr/bin/ ...
- php验证码--图片
这里我们介绍图片验证码的制作,有关字符验证码能够參考下面文章: 点击打开链接 图片验证码的制作分三步: 1.制作图片库 2.随机选取一张图片 3.输出图片内容 代码例如以下(这里为了方便我直接用的本地 ...
- A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets(中英双语)
文章标题 A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets 且谈Apache Spark的API三剑客:RDD.Dat ...
- Linux安装R记要
R在Linux上的安装有一些坑(Windows上安装会方便许多),在这里记录,希望可以减少读者不必要的麻烦.我的服务器是SUSE Linux 64位,无法接入互联网(安全原因,你懂的). 到R官网ht ...