多源最短路计数(Flyod)

P2047 [NOI2007] 社交网络 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N6B9https://www.luogu.com.cn/problem/P2047题目大意:

x = 经过k节点从a到b的最短路数目 /  从a到b的最短路数目,把图中所有合题的x累加求和

注意:

1,dis的无穷初始化和edge的初始化问题

2.注意第一个三层循环的k相当于中继站求最短路的作用,第二个是统计经过k节点从a到b的最短路数目求ans

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxN = 110;
const int INF = 0x3f3f3f3f;
int dis[maxN][maxN];
int edge[maxN][maxN];
double ans[maxN];
void solve()
{
int n,m;
scanf("%lld%lld", &n, &m);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
G[i][j] = dis[i][j] = INF;
}
}
for(int i = 1;i<=m;i++)
{
int a,b,c; scanf("%lld%lld%lld", &a, &b, &c);
dis[a][b] = dis[b][a]= c;
edge[a][b] = edge[b][a] = 1;
}
for(int k = 1;k<=n;k++)
{
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
if( dis[i][k]==INF && dis[k][j]==INF )
continue;
if( dis[i][k]+dis[k][j]<dis[i][j] )
{
dis[i][j] = dis[i][k] + dis[k][j];
edge[i][j] = edge[i][k] * edge[k][j];
}
else if( dis[i][k]+dis[k][j]==dis[i][j] )
edge[i][j] = edge[i][j] + edge[i][k]*edge[k][j];
}
}
}
for(int k = 1;k<=n;k++)
{
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
if(i==j||j==k||i==k)continue;
if( dis[i][k]+dis[k][j]==dis[i][j] )
ans[k] = ans[k] + (double)( 1.0*edge[i][k]*edge[k][j]
)/(double)edge[i][j];
}
}
}
for(int i = 1;i<=n;i++)
printf("%.3lf\n",ans[i]);
}
signed main()
{
int _ = 1;
// scanf("%d", &_);
while( _-- )
solve();
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值