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;
}
相关推荐
你的冰西瓜1 天前
C++ 中最短路算法的详细介绍
c++·算法·图论·最短路
Swift社区1 天前
Swift 图论实战:DFS 算法解锁 LeetCode 323 连通分量个数
算法·swift·图论
浩瀚星辰20242 天前
图论基础算法:DFS、BFS、并查集与拓扑排序的Java实现
java·算法·深度优先·图论
lcg_magic3 天前
图论系列(一):基础概念与术语解析
图论
127_127_1277 天前
2025 FJCPC 复建 VP
数据结构·图论·模拟·ad-hoc·分治·转化
wwer1425263637 天前
数学建模_图论
数学建模·图论
ysa0510308 天前
Dijkstra 算法#图论
数据结构·算法·图论
一只鱼^_8 天前
基础算法合集-图论
数据结构·算法·深度优先·图论·广度优先·宽度优先·图搜索算法
ysa0510308 天前
图论基础算法入门笔记
数据结构·c++·笔记·算法·图论
闻缺陷则喜何志丹20 天前
【并集查找】P10729 [NOISG 2023 Qualification] Dolls|普及+
c++·算法·图论·洛谷·并集查找