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;
}
相关推荐
lmy2012110814 小时前
GESP:2025-3月等级8-T1-上学
c++·算法·图论·dijkstra
xuanjiong1 天前
纯个人整理,蓝桥杯使用的算法模板day4(图论 最小生成树问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·图论
lmy201211081 天前
提高:图论:强连通分量 图的遍历
c++·算法·图论·强联通分量
蒙奇D索大1 天前
【数据结构】图论进阶:生成树、生成森林与权值网络的终极解析
数据结构·考研·图论·改行学it
qystca2 天前
蓝桥云客---九宫幻方
算法·深度优先·图论
jyyyx的算法博客2 天前
【再探图论】深入理解图论经典算法
c++·算法·图论
码农幻想梦3 天前
第八章 图论
图论
鹭天3 天前
【网络流 && 图论建模 && 最大权闭合子图】 [六省联考 2017] 寿司餐厅
图论
OYangxf3 天前
图论----拓扑排序
算法·图论
对方正在长头发丿4 天前
LETTERS(DFS)
c++·笔记·算法·深度优先·图论