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;
}