[NOI 2007]社交网络
Description
为结点v在社交网络中的重要程度。为了使I(v)和Cs,t(v)有意义,我们规定需要处理的社交网络都是连通的无向图,即任意两个结点之间都有一条有限长度的最短路径。现在给出这样一幅描述社交网络的加权无向图,请你求出每一个结点的重要程度。Input
Output
输出包括n行,每行一个实数,精确到小数点后3位。第i行的实数表示结点i在社交网络中的重要程度。
Sample Input
1 2 1
2 3 1
3 4 1
4 1 1
Sample Output
1.000
1.000
1.000
HINT
社交网络如下图所示。

题解
从数据约定来看,$n<=100$,明显可以用$floyd$,而且题目要求算某个中间点的重要程度,也比较符合$floyd$以中间点划分阶段的思想。
这道题主要就是要推理出最短路的条数怎么算。
令$w[i,j]$为从点$i$到点$j$的最短路径条数,$f[i,j]$为最短路。则根据最短路径拥有最优子结构的性质和乘法原理,我们可以得出:
$$w[i,j]=w[i,j]+w[i,k]*w[k,j](f[i,j]=f[i,k]+f[k,j])$$
$$w[i,j]=w[i,k]*w[k,j](f[i,j]>f[i,k]+f[k,j])$$
再令$g[i,j,k]$为从点$i$到点$j$且经过点$k$的最短路径的条数。也正是根据这个最优子结构,我们又可以明白:
$$g[i,j,k]=w[i,k]*w[k,j](f[i,j]=f[i,k]=f[k,j])$$
然后根据题目所给的公式统计答案就行了。
//It is made by Awson on 2017.9.25
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define sqr(x) ((x)*(x))
#define Abs(x) ((x) < 0 ? (-(x)) ? (x))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = ;
LL Read() {
LL sum = ;
char ch = getchar();
while (ch < '' || ch > '') ch = getchar();
while (ch >= '' && ch <= '') sum = (sum<<)+(sum<<)+ch-, ch = getchar();
return sum;
} LL n, m, u, v, c;
LL f[N+][N+];
LL cnt[N+][N+];
double ans[N+]; void work() {
n = Read(), m = Read();
memset(f, /, sizeof(f));
while (m--) {
u = Read(), v = Read(), c = Read();
if (f[u][v] > c) {
f[u][v] = f[v][u] = c;
cnt[u][v] = cnt[v][u] = ;
}
else if (f[u][v] == c)
cnt[u][v] = ++cnt[v][u];
}
for (LL k = ; k <= n; k++)
for (LL i = ; i <= n; i++)
for (LL j = ; j <= n; j++)
if (k != j && k != i && i != j) {
if (f[i][k]+f[k][j] < f[i][j]) {
f[i][j] = f[i][k]+f[k][j];
cnt[i][j] = cnt[i][k]*cnt[k][j];
}
else if (f[i][k]+f[k][j] == f[i][j])
cnt[i][j] += cnt[i][k]*cnt[k][j];
}
for (LL k = ; k <= n; k++)
for (LL i = ; i <= n; i++)
for (LL j = ; j <= n; j++)
if (k != j && k != i && i != j)
if (f[i][k]+f[k][j] == f[i][j])
ans[k] += (double)(cnt[i][k]*cnt[k][j])/(double)(cnt[i][j]);
for (LL i = ; i <= n; i++)
printf("%.3lf\n", ans[i]);
}
int main() {
freopen("bestlink.in", "r", stdin);
freopen("bestlink.out", "w", stdout);
work();
return ;
}
[NOI 2007]社交网络的更多相关文章
- 解题:NOI 2007 社交网络
题面 先跑一边Floyd乘法原理统计任意两点间最短路数目,然后再枚举一次按照题意即可求出答案,会写那道JSOI2007就会这个 #include<cstdio> #include<c ...
- 【NOI 2007】 社交网络
[题目链接] 点击打开链接 [算法] 首先,跑floyd,计算最短路和最短路径数 然后,计算答案,枚举k,s,t,若dist[s][k] + dist[k][t] = dist[s][t], 那么,点 ...
- 【BZOJ 1494】【NOI 2007】生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1494 这道题..因为k很小,而且我们只关心连续的k个节点的连通性,所以把连续的k个点轮廓线上的连通性 ...
- 【BZOJ 1492】【NOI 2007】货币兑换Cash
这是道CDQ分治的例题: $O(n^2)$的DP: f [1]←S* Rate[1] / (A[1] * Rate[1] + B[1]) Ans←SFor i ← 2 to n For j ←1 to ...
- 线性代数(矩阵乘法):NOI 2007 生成树计数
这道题就是深搜矩阵,再快速幂. #include <iostream> #include <cstring> #include <cstdio> #include ...
- [NOI 2007]货币兑换Cash
Description 题库链接 (按我的语文水平完全无 fa♂ 概括题意,找了 hahalidaxin 的题意简述... 有 \(AB\) 两种货币,每天可以可以付 \(IP_i\) 元,买到 \( ...
- NOI 2007 货币兑换Cash (bzoj 1492) - 斜率优化 - 动态规划 - CDQ分治
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- dp式子100个……
1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2------01背包问题F[I,j]:=max(f[i- ...
- dp方程
1. 资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2 ------01背包问题 F[I,j]:=ma ...
随机推荐
- Spring学习笔记四 整合SSH
三大框架架构(整合原理) 步骤1:导包 Hibernate包 1.Hibernate包,hibernate/lib/required 2.hibernate/lib/jpa | java persis ...
- C语言程序设计第三次作业--选择结构(1)
Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...
- C语言---字符数组
一.PTA实验作业 题目1:7-2 统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 定义循环变量i,j定义不为空格的字符数count,定义单词数number,i,j,count,nu ...
- django restful 1-在线Python编辑器
客户端(浏览器)----> 前端页面-----> 后端处理数据,并把数据以 json 形式发送到前端 online_app.py from django.conf import setti ...
- nyoj 孪生素数
孪生素数问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 写一个程序,找出给出素数范围内的所有孪生素数的组数.一般来说,孪生素数就是指两个素数距离为2,近的不能再 ...
- Node入门教程(3)第二章: Node 安装
Node 安装 官网下载地址: https://nodejs.org/en/download/ 安装方式 windows 下安装 建议直接选择:Windows Installer (.msi)下载进行 ...
- CentOS 7 安装Graphite
Graphite简介 Graphite是一个Python编写的企业级开源监控工具,采用django框架,用来收集服务器所有的即时状态,用户请求信息,Memcached命中率,RabbitMQ消息服务器 ...
- JQ 标签相关知识
1.判断 checkbox 和 radio 是否选中 if($("标签选择器").is(":checked")) 2.改变 checkbox 选中状态 .pro ...
- 作业三:模拟 mysql 进行增删改查
# !/usr/bin/env python3 # _*_coding:utf-8_*_ def help_sql(cmd): if cmd in func_dic.keys(): print('{} ...
- pygame事件之——控制物体(飞机)的移动
近来想用pygame做做游戏,在 xishui 大神的目光博客中学了学这东西,就上一段自己写的飞机大战的代码,主要是对键盘控制飞机的移动做了相关的优化 # -*- coding: utf-8 -*- ...