CodeForces-208C Police Station

大意:
有n个城市,编号为1-n,有m条双向路,现要在一个点设立警察局,通过这个点的路就是安全路,求1到n的每条最短路上平均的安全路的条数,即安全路总可能条数/总最短路条数。

思路:
假设在某个点X建立警察局 那么 就可能存在2个安全路 在X点建立警察局的总条数就是从 1——X的路径 乘以 X——n的路径 总的最短条数便是1——n的所有最短条数 所以 用spfa计算最短路 dp记录条数 此题需要LL;

#include<bits/stdc++.h>
using namespace std; 
 
typedef long long ll;
const int inf = 0x3f3f3f;
vector<int> num[105];
ll dis[105] , dp[105];
int n,m;

void spfa (int s)
{
	for(int i = 1; i <= n; i++)
	{
		dp[i] = 0;
		dis[i] = inf; 
	}
	dis[s] = 0;
	dp[s] = 1;
	queue<int> q;
	q.push(s);
	while(!q.empty())
	{
		int start = q.front();
		q.pop();
		for(int i = 0; i < num[start].size(); i++)
		{
			int end = num[start][i];
			if(dis[end] > dis[start] + 1)
			{
				dis[end] = dis[start] + 1;
				dp[end] = dp[start];
				q.push(end);
			}
			else if(dis[end] == dis[start] + 1) dp[end] += dp[start];
		}
	
	}
}



int main()
{
	int a , b ;
	scanf("%d%d",&n,&m);
	for(int i =0; i < m; i++)
	{
		scanf("%d %d ",&a,&b);
		num[a].push_back(b);
		num[b].push_back(a);
		
	 } 
	 spfa(1);
	 ll len = dis[n]; 
	 ll sum = dp[n];
	 double ans = 1.0;
	 for(int i = 2; i < n ;i++)
	 {
	 	spfa(i);
	 	if(dis[1] + dis[n] == len)
	 	{
	 		ans = max(ans,2.0*dp[1]*dp[n]/(double)sum);
		 }
	 }
	printf("%.12lf\n",ans);
	return 0;
	
} 
posted @ 2020-09-02 19:22  天明天明  阅读(147)  评论(0编辑  收藏  举报