D. Bear and Chase

题目连接:

http://codeforces.com/contest/679/problem/D

Description

Bearland has n cities, numbered 1 through n. There are m bidirectional roads. The i-th road connects two distinct cities ai and bi. No two roads connect the same pair of cities. It's possible to get from any city to any other city (using one or more roads).

The distance between cities a and b is defined as the minimum number of roads used to travel between a and b.

Limak is a grizzly bear. He is a criminal and your task is to catch him, or at least to try to catch him. You have only two days (today and tomorrow) and after that Limak is going to hide forever.

Your main weapon is BCD (Bear Criminal Detector). Where you are in some city, you can use BCD and it tells you the distance between you and a city where Limak currently is. Unfortunately, BCD can be used only once a day.

You don't know much about Limak's current location. You assume that he is in one of n cities, chosen uniformly at random (each city with probability ). You decided for the following plan:

Choose one city and use BCD there.
After using BCD you can try to catch Limak (but maybe it isn't a good idea). In this case you choose one city and check it. You win if Limak is there. Otherwise, Limak becomes more careful and you will never catch him (you loose).
Wait 24 hours to use BCD again. You know that Limak will change his location during that time. In detail, he will choose uniformly at random one of roads from his initial city, and he will use the chosen road, going to some other city.
Tomorrow, you will again choose one city and use BCD there.
Finally, you will try to catch Limak. You will choose one city and check it. You will win if Limak is there, and loose otherwise.
Each time when you choose one of cities, you can choose any of n cities. Let's say it isn't a problem for you to quickly get somewhere.

What is the probability of finding Limak, if you behave optimally?

Input

The first line of the input contains two integers n and m (2 ≤ n ≤ 400, ) — the number of cities and the number of roads, respectively.

Then, m lines follow. The i-th of them contains two integers ai and bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — cities connected by the i-th road.

No two roads connect the same pair of cities. It's possible to get from any city to any other city.

Output

Print one real number — the probability of finding Limak, if you behave optimally. Your answer will be considered correct if its absolute error does not exceed 10 - 6.

Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct if |a - b| ≤ 10 - 6.

Sample Input

3 3
1 2
1 3
2 3

Sample Output

0.833333333333

Hint

题意

有一个人,在一个图里面开始找罪犯了。

这个人有两天的抓捕机会,他会在每一天都有机会使用BCD机器,这个BCD机器会返回这个罪犯离他的距离是多少。

当然这个人要么在第一天去抓罪犯,要么在第二天去抓罪犯。

这个罪犯也不是一个傻逼,如果那个人第一天不抓他的话,那么第二天的时候,这个罪犯就会转移阵地。

然后现在问你,在最佳情况下,这个人抓住这个罪犯的概率是多少?

题解:

考虑最暴力的情况,枚举罪犯第一天哪儿,第二天在哪儿,枚举警察第一天在哪儿使用BCD,第二天在哪儿使用BCD

这个复杂度是n^4的,显然过不了,但是显然是对的。

我们优化一下。

暴力枚举这个警察第一天在哪儿使用BCD的地点A,暴力枚举BCD返回的距离a,再暴力枚举第二天使用BCD的地点B。

显然罪犯只有可能出现在三种位置,就是距离A地点距离为a,a-1,a+1的三个地方。

这样优化了一下之后,复杂度就变成n^3了,就可以直接莽过去了。

代码

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
const int maxn = 405;
int d[maxn][maxn],n,m;
double dis[maxn];
double posi[maxn];
vector<int> E[maxn];
vector<int> f;
void TAT()
{memset(d,127,sizeof(127));
}
double next(int p,int di)
{double ans = 0;memset(posi,0,sizeof(posi));for(int i=1;i<=n;i++)if(d[p][i]==di)for(auto v:E[i])posi[v]+=1./n/E[i].size();f.clear();for(int i=1;i<=n;i++)if(posi[i]>eps)f.push_back(i);for(int i=1;i<=n;i++){double tmp = 0;for(auto v:f)dis[d[i][v]]=max(dis[d[i][v]],posi[v]);for(auto v:f){tmp+=dis[d[i][v]];dis[d[i][v]]=0;}ans=max(ans,tmp);}return ans;
}
void QAQ()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j)d[i][j]=n+1;for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);d[a][b]=1;d[b][a]=1;E[a].push_back(b);E[b].push_back(a);}for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);double ans = 0;for(int i=1;i<=n;i++){double tmp = 0;for(int di=0;di<n;di++){int cnt = 0;for(int j=1;j<=n;j++)if(d[i][j]==di)cnt++;if(cnt==0)continue;double day1 = 1./n;double day2 = next(i,di);tmp+=max(day1,day2);}ans=max(ans,tmp);}printf("%.12f\n",ans);
}
int main()
{TAT();QAQ();return 0;
}

Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力相关推荐

  1. Codeforces Round #743 (Div. 2) E. Paint 区间dp + 暴力

    传送门 文章目录 题意: 思路: 题意: 给你一个有nnn个像素的图像,每个像素都有一个颜色aia_iai​,保证每种颜色的图像不会超过202020个.你现在每次可以选择一个颜色,并选择一段连续的像素 ...

  2. Codeforces Round #271 (Div. 2) C. Captain Marmot (暴力枚举+正方形判定)

    题目链接:Codeforces Round #271 (Div. 2) C. Captain Marmot 题意:给4行数据,每行2个点.(x,y).(a,b).意思是(x,y)绕(a,b)逆时针旋转 ...

  3. dfs Codeforces Round #356 (Div. 2) D

    http://codeforces.com/contest/680/problem/D 题目大意:给你一个大小为X的空间(X<=m),在该空间内,我们要尽量的放一个体积为a*a*a的立方体,且每 ...

  4. Codeforces Round #318 (Div. 2) B Bear and Three Musketeers (暴力)

    算一下复杂度.发现可以直接暴.对于u枚举a和b,判断一下是否连边,更新答案. #include<bits/stdc++.h> using namespace std;int n,m; co ...

  5. Codeforces Round #253 (Div. 1) A. Borya and Hanabi 暴力

    A. Borya and Hanabi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/442/p ...

  6. Codeforces Round #614 (Div. 2) D. Aroma‘s Search 暴力 + 思维

    传送门 文章目录 题意: 思路: 题意: 给你x0,y0,ax,ay,bx,byx_0,y_0,a_x,a_y,b_x,b_yx0​,y0​,ax​,ay​,bx​,by​,让后根据[ax∗xi−1+ ...

  7. Codeforces Round #315 (Div. 1) A. Primes or Palindromes? 暴力

    A. Primes or Palindromes? Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=326 ...

  8. Codeforces Round #481 (Div. 3) F. Mentors(排序,暴力,map记忆化)

    题目 题意: 如果一个程序员比另一个程序员的能力值高,而且这两个程序员不在争吵状态,则能力值较高的程序员可以成为另一个程序员的老师,求每个程序员能成为多少其他程序员的老师. 思路: 先啥都不管,结构体 ...

  9. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

最新文章

  1. JavaScript初学者编程题(11)
  2. 外部情况错综复杂,联想靠什么过「久日子」
  3. 在微信小程序里自动获得当前手机所在的经纬度并转换成地址
  4. Chrome DevTools — Network
  5. java冻结行列,poi冻结行和列 - osc_0k23td2u的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. java里的关键字有什么用_java语言关键字有哪些?都有什么用处?
  7. 用python处理excel的基本语法_《使用python3读取处理excel表的数据内容如何对内容求平均值》 用python读取excel文件...
  8. LeetCode003-无重复字符的最长子串(Length of longest substring)-Rust语言实现
  9. 网络爬虫之css选择器
  10. php pdo 显示二进制,php – 在MySQL PDO中显示警告
  11. [海隆软件][方正电机]IPO,打新股中
  12. linux 安装Java
  13. Android SIP软电话,通话录音,VoIP电话,linphone电话
  14. loadrunner11 post请求接口压力测试并生成报告
  15. 【VIP视频网站项目一】搭建视频网站的前台页面(导航栏+轮播图+电影列表+底部友情链接)
  16. 3000字长文:探讨报销系统使用满意度的NPS指标设计
  17. pandas 取每天某个时刻的数据
  18. android的NDK安装及工程实例
  19. whai is gradient vanishing and exploding ?
  20. python中pd是什么意思_何时申请(pd.to_numeric)以及何时在python中使用...

热门文章

  1. 通用印刷体文字识别_五个超级实用的OCR文字识别小程序,完全免费、值得收藏!...
  2. php取json子对象属性,PHP json获取相关对象值
  3. 由于找不到Qt5widgets.dll,无法继续执行代码。重新安装程序可能会解决此问题。
  4. mysql +hive 安装
  5. C 语言日期时间处理
  6. P3919 【模板】可持久化数组(可持久化线段树/平衡树)(入门第一题)
  7. KubeSphere中部署Minio服务
  8. JDK8新特性(一)之Lambda表达式
  9. Git flow常用命令
  10. 使用MyBatis Plus 3.2.0版本插件代码生成器生成实体类后,对于数据库中字段类型datetime的字段会转变为LocalDateTime类型