P2047 [NOI2007] 社交网络

Portal.

观察到数据范围 n ≤ 100 n\leq 100 n≤100,考虑用 Floyd。

在 Floyd 更新最短路的过程中,如果以当前结点为中转点的路径更新过,那么可以累加答案;否则,更新最短路径并重置答案。

统计答案时,枚举中转点判断累加即可。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

int f[105][105],C[105][105];
double I[105];

signed main()
{
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=1e9;
	for(int i=1,a,b,c;i<=m;i++) cin>>a>>b>>c,f[a][b]=f[b][a]=c,C[a][b]=C[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(i!=j&&j!=k&&i!=k)
				{
					if(f[i][j]==f[i][k]+f[k][j]) C[i][j]+=C[i][k]*C[k][j];
					else if(f[i][j]>f[i][k]+f[k][j]) f[i][j]=f[i][k]+f[k][j],C[i][j]=C[i][k]*C[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&&k!=i&&f[i][j]==f[i][k]+f[k][j]) I[k]+=((double)C[i][k]*C[k][j])/C[i][j];
	for(int i=1;i<=n;i++) printf("%.3lf\n",I[i]);
	return 0;
}
相关推荐
hnjzsyjyj12 小时前
洛谷 T145300:这是一棵树吗? ← 图论握手定理
图论·握手定理
故事和你9119 小时前
洛谷-【图论2-1】树2
开发语言·数据结构·c++·算法·动态规划·图论
刀法如飞1 天前
Ontology本体论是什么数据结构?Palantir 技术原理介绍
数据结构·人工智能·ai编程·图论
khalil10202 天前
代码随想录算法训练营Day-50 图论02 | 99.岛屿数量-深搜、99.岛屿数量-广搜 、100.岛屿的最大面积
数据结构·c++·算法·leetcode·深度优先·图论
khalil10203 天前
代码随想录算法训练营Day-49 图论01 | 图论理论基础、深搜理论基础、98. 所有可达路径、广搜理论基础
c++·算法·leetcode·深度优先·图论
洛水水3 天前
【力扣100题】27. 二叉树的最大深度
算法·leetcode·图论
故事和你913 天前
洛谷-【数据结构2-2】线段树2
开发语言·数据结构·算法·动态规划·图论
故事和你913 天前
洛谷-【数据结构2-2】线段树1
开发语言·javascript·数据结构·算法·动态规划·图论
鱼子星_3 天前
最短路问题【图论】
数据结构·算法·贪心算法·动态规划·图论
是wzoi的一名用户啊~5 天前
Floyd 模版 弗洛伊德算法 模版
c++·算法·动态规划·图论·floyd