CodeForces - 208C Police Station 最短路

The Berland road network consists of n cities and of m bidirectional roads. The cities are numbered from 1 to n, where the main capital city has number n, and the culture capital — number 1. The road network is set up so that it is possible to reach any city from any other one by the roads. Moving on each road in any direction takes the same time.

All residents of Berland are very lazy people, and so when they want to get from city v to city u, they always choose one of the shortest paths (no matter which one).

The Berland government wants to make this country's road network safer. For that, it is going to put a police station in one city. The police station has a rather strange property: when a citizen of Berland is driving along the road with a police station at one end of it, the citizen drives more carefully, so all such roads are considered safe. The roads, both ends of which differ from the city with the police station, are dangerous.

Now the government wonders where to put the police station so that the average number of safe roads for all the shortest paths from the cultural capital to the main capital would take the maximum value.

Input

The first input line contains two integers n and m (2 ≤ n ≤ 100, ) — the number of cities and the number of roads in Berland, correspondingly. Next m lines contain pairs of integers vi, ui (1 ≤ vi, ui ≤ n, vi ≠ ui) — the numbers of cities that are connected by the i-th road. The numbers on a line are separated by a space.

It is guaranteed that each pair of cities is connected with no more than one road and that it is possible to get from any city to any other one along Berland roads.

Output

Print the maximum possible value of the average number of safe roads among all shortest paths from the culture capital to the main one. The answer will be considered valid if its absolute or relative inaccuracy does not exceed 10 - 6.

Examples

Input

4 4
1 2
2 4
1 3
3 4

Output

1.000000000000

Input

11 14
1 2
1 3
2 4
3 4
4 5
4 6
5 11
6 11
1 8
8 9
9 7
11 7
1 10
10 4

Output

1.714285714286

Note

In the first sample you can put a police station in one of the capitals, then each path will have exactly one safe road. If we place the station not in the capital, then the average number of safe roads will also make .

In the second sample we can obtain the maximum sought value if we put the station in city 4, then 6 paths will have 2 safe roads each, and one path will have 0 safe roads, so the answer will equal .

题解:找到最短路,枚举每个点即可,若警察在中间某个位置,那有两个安全路

坑点:记录最短路条数用 long long

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
#define pb push_back
#define M(a,b) memset(a,b,sizeof(a))  
#define INF 0x3f3f3f3f
const int N=110;
int n,m,dis[N],vis[N];
ll num[N];
vector<int> v[N];
struct node{
	int to;
	node(){};
	node(int to):to(to){};
	bool operator <(const node &x)const
	{
		return dis[to]>dis[x.to];
	}
};
ll Dij(int u)
{
	M(dis,INF),M(vis,0),M(num,0);
	dis[u]=0;
	priority_queue<node> q;
	num[u]=1;
	q.push(node(u));
	while(!q.empty())
	{
		node noww=q.top();q.pop();
		int now=noww.to;
		if(vis[now]) continue;
		vis[now]=1;
		for(int i=0;i<v[now].size();i++)
		{
			int to=v[now][i];
			if(dis[now]+1<dis[to])
			{
				num[to]=num[now];
				dis[to]=dis[now]+1;
				q.push(node(to));
			}
			else if(dis[now]+1==dis[to])
				num[to]+=num[now];
		}
	}
//	cout<<dis[1]<<" "<<dis[n]<<endl;
	return (ll)dis[n]+dis[1];
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
    	int x,y;
    	for(int i=1;i<=m;i++)
    	{
    		scanf("%d%d",&x,&y);
    		v[x].pb(y);
    		v[y].pb(x);
		}
		ll minn=Dij(1);
		double ans=1,cnt=num[n];
		for(int i=2;i<n;i++)
		{
			if(Dij(i)==minn)
				ans=max(ans,2.0*num[1]*num[n]/cnt);			
		}
		printf("%.12f\n",ans);
		
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值