题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=1491
题目大意:
见链接
思路:
直接用floyd算法求最短路,同时更新最短路的数目即可。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
#define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Mem(a) memset(a, 0, sizeof(a))
#define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
#define MID(l, r) ((l) + ((r) - (l)) / 2)
#define lson ((o)<<1)
#define rson ((o)<<1|1)
#define Accepted 0
#pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} typedef long long ll;
const int maxn = + ;
const int MOD = ;//const引用更快,宏定义也更快
const int INF = 1e9 + ;
const double eps = 1e-; int Map[maxn][maxn];
ll p[maxn][maxn];
double ans[maxn];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++)for(int j = ; j <= n; j++)Map[i][j] = INF;
while(m--)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
Map[u][v] = Map[v][u] = w;
p[u][v] = p[v][u] = ;//路径条数
}
for(int k = ; k <= n; k++)
{
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
if(Map[i][k] + Map[k][j] < Map[i][j])
{
Map[i][j] = Map[i][k] + Map[k][j];
p[i][j] = p[i][k] * p[k][j];
}
else if(Map[i][k] + Map[k][j] == Map[i][j])
p[i][j] += p[i][k] * p[k][j];
}
}
}
for(int k = ; k <= n; k++)//k为s-t的必经点
for(int s = ; s <= n; s++)
for(int t = ; t <= n; t++)
if(s != t && s != k && k != t)
{
if(Map[s][k] + Map[k][t] == Map[s][t])//最短路径可以经过k点
{
ans[k] += 1.0 * p[s][k] * p[k][t] / p[s][t];
}
}
for(int i = ; i <= n; i++)printf("%.3f\n", ans[i]);
return Accepted;
}