解题:NOI 2007 社交网络
2024-10-16 08:28:16
先跑一边Floyd乘法原理统计任意两点间最短路数目,然后再枚举一次按照题意即可求出答案,会写那道JSOI2007就会这个
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
long long n,m,t1,t2,t3;
long long mat[N][N],cnt[N][N];
double ans[N];
int main ()
{
scanf("%lld%lld",&n,&m);
memset(mat,0x3f,sizeof mat);
for(int i=;i<=m;i++)
{
scanf("%lld%lld%lld",&t1,&t2,&t3);
mat[t1][t2]=mat[t2][t1]=t3;
cnt[t1][t2]=cnt[t2][t1]=;
}
for(int i=;i<=n;i++) mat[i][i]=;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j&&i!=k&&j!=k)
{
if(mat[i][j]>mat[i][k]+mat[k][j])
{
mat[i][j]=mat[i][k]+mat[k][j];
cnt[i][j]=cnt[i][k]*cnt[k][j];
}
else if(mat[i][j]==mat[i][k]+mat[k][j])
cnt[i][j]+=cnt[i][k]*cnt[k][j];
}
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j&&i!=k&&j!=k)
if(mat[i][k]+mat[k][j]==mat[i][j])
ans[k]+=(double)cnt[i][k]*cnt[k][j]/cnt[i][j];
for(int i=;i<=n;i++)
printf("%.3lf\n",ans[i]);
return ;
}
最新文章
- 【译】AS3利用CPU缓存
- 转载--How to Install VMware Tools on CentOS 6.3
- Android Studio使用教程(一)(转)
- C# Thread.Join()用法的理解 转
- 字典树trie的学习与练习题
- 深入浅出之Smarty模板引擎工作机制(二)
- 转 java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
- Rxjava observeOn()和subscribeOn()初探
- Eclipse CDT开发环境搭建及问题记录(Windows)
- sublime高亮代码导出
- Python开发【第十六篇】:AJAX全套(转)
- Matplotlib画正弦余弦曲线
- 版本控制工具之git
- LINUX涉及网络相关知识
- svg(一)
- DMA与cache一致性的问题
- NGINX 资料
- 【Redis】Redis-benchmark测试Redis性能
- 纯CSS + 媒体查询实现网页导航特效
- [BZOJ1974][SDOI2010]代码拍卖会[插板法]