P2047 [NOI2007]社交网络

题目描述

在社交网络(\(social\) \(network\))的研究中,我们常常使用图论概念去解释一些社会现象。不妨看这样的一个问题。在一个社交圈子里有\(n\)个人,人与人之间有不同程度的关系。我 们将这个关系网络对应到一个\(n\)个结点的无向图上,两个不同的人若互相认识,则在他们对应的结点之间连接一条无向边,并附上一个正数权值\(c\),\(c\)越小,表示两 个人之间的关系越密切。

我们可以用对应结点之间的最短路长度来衡量两个人\(s\)和\(t\)之间的关系密切程度,注意到最短路径上的其他结点为\(s\)和\(t\)的联系提供了某种便利, 即这些结点对于\(s\)和\(t\)之间的联系有一定的重要程度。我们可以通过统计经过一个结点\(v\)的最短路径的数目来衡量该结点在社交网络中的重要程度。

考虑到两个结点\(A\)和\(B\)之间可能会有多条最短路径。我们修改重要程度的定义如下:

令\(C_{s,t}\)表示从\(s\)到\(t\)的不同的最短路的数目,\(C_{s,t(v)}\)表示经过\(v\)从\(s\)到\(t\)的最短路的数目;则定义

\(I(v)=\sum_{s!=v,t!=v} C_{s,t(v)}/C_{s,t}\)

为结点\(v\)在社交网络中的重要程度。

为了使\(I(v)\)和\(C_{s,t(v)}\)有意义,我们规定需要处理的社交网络都是连通的无向图,即任意两个结点之间都有一条有限长度的最短路径。

现在给出这样一幅描述社交网络s的加权无向图,请你求出每一个结点的重要程度。

输入输出格式

输入格式:

输入第一行有两个整数,\(n\)和\(m\),表示社交网络中结点和无向边的数目。在无向图中,我们将所有结点从1到\(n\)进行编号。

接下来\(m\)行,每行用三个整数\(a\),\(b\),\(c\)描述一条连接结点\(a\)和\(b\),权值为\(c\)的无向边。注意任意两个结点之间最多有一条无向边相连,无向图中也不会出现自环(即不存在一条无向边的两个端点是相同的结点)。

输出格式:

输出包括\(n\)行,每行一个实数,精确到小数点后3位。第\(i\)行的实数表示结点\(i\)在社交网络中的重要程度


这是一道最短路计数+枚举的题目。

提供一种disj的最短路计数思路。

当某个点已经松弛完毕,去松弛其他点时,若松弛成功,则将计数改为这个点的计数,若不成功但权值与对方相等,则把自己的计数加上去。

最后枚举每个点,看是否在\(s,t\)的最短路上,如果在,用乘法原理计算即可。


Code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define P pair<int,int >
#define ll long long
using namespace std;
const int N=102;
const int M=9020;
int head[N],edge[M],to[M],next[M],cnt0;
void add(int u,int v,int w)
{
to[++cnt0]=v;edge[cnt0]=w;next[cnt0]=head[u];head[u]=cnt0;
to[++cnt0]=u;edge[cnt0]=w;next[cnt0]=head[v];head[v]=cnt0;
}
priority_queue <P,vector <P >,greater<P> > q;
P p;int n,m;ll cnt[N][N];
int dis[N][N],used[N];
void disj(int s)
{
memset(used,0,sizeof(used));
dis[s][s]=0;
cnt[s][s]=1;
p.first=0,p.second=s;
q.push(p);
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(used[u]) continue;
used[u]=1;
for(int i=head[u];i;i=next[i])
{
int v=to[i],w=edge[i];
if(dis[s][v]>dis[s][u]+w)
{
dis[s][v]=dis[s][u]+w;
cnt[s][v]=cnt[s][u];
p.first=dis[s][v],p.second=v;
q.push(p);
}
else if(dis[s][v]==dis[s][u]+w)
cnt[s][v]+=cnt[s][u];
}
}
cnt[s][s]=0;
}
int main()
{
scanf("%d%d",&n,&m);
int u,v,w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)
disj(i);
for(int k=1;k<=n;k++)
{
double ans=0.0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(cnt[i][j]&&dis[i][k]+dis[k][j]==dis[i][j])
ans+=double(cnt[i][k]*cnt[k][j])/double(cnt[i][j]);
printf("%.3lf\n",ans);
}
return 0;
}

2018.7.1

洛谷 P2047 [NOI2007]社交网络 解题报告的更多相关文章

  1. 洛谷——P2047 [NOI2007]社交网络

    P2047 [NOI2007]社交网络 $Floyd$,一眼看到就是他(博主是不小心瞄到了这个题的标签吧qwq) 这个题目只要预处理出$S$到$T$的最短路的条数即可,类似$Spfa$的更新方法 如果 ...

  2. 洛谷 P4027 [NOI2007]货币兑换 解题报告

    P4027 [NOI2007]货币兑换 题目描述 小 \(Y\) 最近在一家金券交易所工作.该金券交易所只发行交易两种金券:\(A\) 纪念券(以下简称 \(A\) 券)和 \(B\) 纪念券(以下简 ...

  3. 洛谷P2047 [NOI2007]社交网络 [图论,最短路计数]

    题目传送门 社交网络 题目描述 在社交网络(social network)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之间有不同程度的关系. ...

  4. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  5. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  6. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  7. BZOJ1491 洛谷2047 NOI2007 社交网络

    Description: 在社交网络(social network)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之间有不同程度的关系.我 们 ...

  8. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  9. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

随机推荐

  1. 现有工程中集成Cordova

    cocoapods引入cordova源码 1.依赖Cordova和wk插件 pod 'Cordova' pod 'cordova-plugin-wkwebview-engine' 建立Cordova支 ...

  2. 20155325 Exp8 Web基础

    实验要求 (1).Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2).Web前端javascipt(0 ...

  3. 奔跑吧vivado

        上一节一上来就是Linux,不是炫耀我们的MiZ702能跑Linux,而是为了方便的把外设一次性测试完.大家都知道MiZ702精华在于FPGA与ARM的完美融合,就像太极一样阴阳调和--软中有 ...

  4. RyuBook1.0案例二:Traffic Monitor项目源码分析

    Traffic Monitor源码分析 从simple_switch_13.SimpleSwitch13控制器继承并开发 class SimpleMonitor13(simple_switch_13. ...

  5. Bitmap 位图 Java实现

    一.结构思想 以 bit 作为存储单位进行布尔值存取的数据结构. 表现为:给定第i位,该bit为1则表示true,为0则表示false. 二.使用场景及优点 适用于对布尔或0.1值进行(大量)存取的场 ...

  6. 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)

    目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...

  7. HyperLedger Fabric 学习思路分享

    HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常 ...

  8. PHP学习 函数 function

    参数默认值function drink($kind ='tea'){echo 'would you please a cup'.$kind.'<br>';} drink();drink(' ...

  9. 【MOOC EXP】Linux内核分析实验一报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [反汇编一个简单的C程序]   实验 ...

  10. Java的起源和发展

    程序设计语言的发展             第一代语言:机器语言   0011 1100 ……             第二代语言:汇编语言   ADD 12,0x13              第三 ...