这道题一开始自己本来想出来了。。
结果自己又把自己推翻了。。于是看题解和自己一样。
还好刘教授帮我解释了一下floyd对于一条最短路只会判一次在K=这条路径上最大的那个点的时候。
后面又因为滥用memset(f,127,sizeof(f))导致f[i][k] + f[j][k]会爆所以wa掉了
喜闻乐见地贴代码:
/*
ID:WULALA
PROB:bzoj1491
LANG:C++
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <fstream>
#include <ctime>
#define N 108
#define M
#define mod
#define mid(l,r) ((l+r) >> 1)
#define INF 0x7ffffff
using namespace std;
long long n,m,f[N][N],sum[N][N];
double w[N];
void init()
{
scanf("%lld%lld",&n,&m);
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
sum[i][j] = 1,f[i][j] = INF;
for (int i = 1;i <= n;i++) f[i][i] = 0;
for (int i = 1;i <= m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
f[a][b] = f[b][a] = c;
}
}
void floyd()
{
for (int k = 1;k <= n;k++)
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
{
if (k == i||i == j||j == k) continue;
if (f[i][j] == f[i][k] + f[k][j]) sum[i][j] += sum[i][k] * sum[k][j];
else if (f[i][j] > f[i][k] + f[k][j]) f[i][j] = f[i][k] + f[k][j],sum[i][j] = sum[i][k] * sum[k][j];
}
}
void work()
{
for (int k = 1;k <= n;k++)
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
{
if (k == i||i == j||j == k) continue;
if (f[i][j] == f[i][k] + f[k][j])
w[k] += (double)(sum[i][k] * sum[k][j]) / (double)(sum[i][j]);
}
}
int main()
{
init();
floyd();
work();
for (int i = 1;i <= n;i++)
printf("%.3lf\n",w[i]);
return 0;
}