[NOI 2007]社交网络

Description

在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象。不妨看这样的一个问题。在一个社交圈子里有n个人,人与人之间有不同程度的关系。我们将这个关系网络对应到一个n个结点的无向图上,两个不同的人若互相认识,则在他们对应的结点之间连接一条无向边,并附上一个正数权值c,c越小,表示两个人之间的关系越密切。我们可以用对应结点之间的最短路长度来衡量两个人s和t之间的关系密切程度,注意到最短路径上的其他结点为s和t的联系提供了某种便利,即这些结点对于s和t之间的联系有一定的重要程度。我们可以通过统计经过一个结点v的最短路径的数目来衡量该结点在社交网络中的重要程度。考虑到两个结点A和B之间可能会有多条最短路径。我们修改重要程度的定义如下:令Cs,t表示从s到t的不同的最短路的数目,Cs,t(v)表示经过v从s到t的最短路的数目;则定义为结点v在社交网络中的重要程度。为了使I(v)和Cs,t(v)有意义,我们规定需要处理的社交网络都是连通的无向图,即任意两个结点之间都有一条有限长度的最短路径。现在给出这样一幅描述社交网络的加权无向图,请你求出每一个结点的重要程度。

Input

输入第一行有两个整数n和m,表示社交网络中结点和无向边的数目。在无向图中,我们将所有结点从1到n进行编号。接下来m行,每行用三个整数a,b,c描述一条连接结点a和b,权值为c的无向边。注意任意两个结点之间最多有一条无向边相连,无向图中也不会出现自环(即不存在一条无向边的两个端点是相同的结点)。n≤100;m≤4500 ,任意一条边的权值 c 是正整数,满足:1≤c≤1000。所有数据中保证给出的无向图连通,且任意两个结点之间的最短路径数目不超过 10^10

Output

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

Sample Input

4 4
1 2 1
2 3 1
3 4 1
4 1 1

Sample Output

1.000
1.000
1.000
1.000

HINT

社交网络如下图所示。

对于 1 号结点而言,只有 2 号到 4 号结点和 4 号到 2 号结点的最短路经过 1 号结点,而 2 号结点和 4 号结点之间的最短路又有 2 条。因而根据定义,1 号结点的重要程度计算为 1/2 + 1/2 = 1 。由于图的对称性,其他三个结点的重要程度也都是 1 。

题解

从数据约定来看,$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])$$
然后根据题目所给的公式统计答案就行了。

 1 //It is made by Awson on 2017.9.25
 2 #include <set>
 3 #include <map>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <string>
10 #include <cstdio>
11 #include <cstdlib>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 #define LL long long
16 #define Max(a, b) ((a) > (b) ? (a) : (b))
17 #define Min(a, b) ((a) < (b) ? (a) : (b))
18 #define sqr(x) ((x)*(x))
19 #define Abs(x) ((x) < 0 ? (-(x)) ? (x))
20 #define lowbit(x) ((x)&(-(x)))
21 using namespace std;
22 const int N = 100;
23 LL Read() {
24     LL sum = 0;
25     char ch = getchar();
26     while (ch < ‘0‘ || ch > ‘9‘) ch = getchar();
27     while (ch >= ‘0‘ && ch <= ‘9‘) sum = (sum<<3)+(sum<<1)+ch-48, ch = getchar();
28     return sum;
29 }
30
31 LL n, m, u, v, c;
32 LL f[N+5][N+5];
33 LL cnt[N+5][N+5];
34 double ans[N+5];
35
36 void work() {
37     n = Read(), m = Read();
38     memset(f, 127/3, sizeof(f));
39     while (m--) {
40     u = Read(), v = Read(), c = Read();
41     if (f[u][v] > c) {
42         f[u][v] = f[v][u] = c;
43         cnt[u][v] = cnt[v][u] = 1;
44     }
45     else if (f[u][v] == c)
46         cnt[u][v] = ++cnt[v][u];
47     }
48     for (LL k = 1; k <= n; k++)
49     for (LL i = 1; i <= n; i++)
50         for (LL j = 1; j <= n; j++)
51         if (k != j && k != i && i != j) {
52             if (f[i][k]+f[k][j] < f[i][j]) {
53             f[i][j] = f[i][k]+f[k][j];
54             cnt[i][j] = cnt[i][k]*cnt[k][j];
55             }
56             else if (f[i][k]+f[k][j] == f[i][j])
57             cnt[i][j] += cnt[i][k]*cnt[k][j];
58         }
59     for (LL k = 1; k <= n; k++)
60     for (LL i = 1; i <= n; i++)
61         for (LL j = 1; j <= n; j++)
62         if (k != j && k != i && i != j)
63             if (f[i][k]+f[k][j] == f[i][j])
64             ans[k] += (double)(cnt[i][k]*cnt[k][j])/(double)(cnt[i][j]);
65     for (LL i = 1; i <= n; i++)
66     printf("%.3lf\n", ans[i]);
67 }
68 int main() {
69     freopen("bestlink.in", "r", stdin);
70     freopen("bestlink.out", "w", stdout);
71     work();
72     return 0;
73 }
时间: 2024-08-07 17:41:43

[NOI 2007]社交网络的相关文章

[BZOJ 1491] [NOI 2007] 社交网络

好吧先不吐槽这道题的题目是一部介绍facebook的电影…… 1491: [NOI2007]社交网络 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1010  Solved: 584[Submit][Status][Discuss] Description Input Output 输出文件包括n 行,每行一个实数,精确到小数点后3 位.第i 行的实数表 示结点i 在社交网络中的重要程度. Sample Input 4 4 1 2 1 2 3 1

线性代数(矩阵乘法):NOI 2007 生成树计数

这道题就是深搜矩阵,再快速幂. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <map> 5 using namespace std; 6 const int maxn=200; 7 const int mod=65521; 8 struct Matrix{ 9 long long mat[maxn][maxn]; 10 int r,c; 11 Matrix

BZOJ 1493 NOI 2007 项链工厂 Splay

题目大意:有一个很长的带颜色的项链,要求你快速的维护一种数据结构,他可以: 1.把序列的后k个放在前面. 2.将区间2~cnt的珠子翻转. 3.将位置i和位置j的珠子互换. 4.将区间i到j染色成k 5.输出整个序列的颜色块的个数 6.输出从i到j的颜色块的个数. 思路:Splay.有些不好处理的是要时刻想着这是一个环,所以所有的计算颜色块的个数的时候要考虑收尾的颜色是否相同.还有从序列的尾部到转一圈回去的情况. 就因为这个题我的代码有个小小小小的问题,花了仨小时的时间带着数据才把错找到..简直

BZOJ 1492 NOI 2007 货币兑换Cash CDQ分治+斜率优化DP

题目大意:有两种金券,A和B.每一天有一个rate值,表示购入的比例:还有每一天AB金券的售价.现在给出初始的钱数,问最后能够获得多少钱. 思路:这算是神题了吧,啃论文啃别人代码将近一天才算有点明白. 首先题目中说的可以买一部分或者卖一部分是扯淡的,因为为了最大获利一定要全部买入,全部卖出.朴素的DP方程就好弄了. 设f[i]为第i天最多的B券的数量.那么f[i] = (rate[j] * f[j] * a[i] + f[j] * b[i]) / (rate[i] * a[i] + b[i])

BZOJ 2007 NOI 2010 海拔 平面图最小割-&gt;最短路SPFA+pq

题目大意:给出一个城市各个道路的双向流量,城市的左上角的高度是0,城市的右下角的高度是1,若人流升高海拔就会消耗体力,问最小需要消耗多少体力. 思路:这道题才是真正的让我见识到了algorithm中的heap的强大. 分析这道题可以发现,一定会有一条分界线,这个分界线左边高度都为0,右边高度都是1,然后找到这条分界点就可以了.明显的最小割.但是数据量巨大,直接跑最大流会T,又是平面图,建立对偶图然后跑最短路,SPFA+pq在BZOJ上可以很快,如果有的OJ卡STL的话可以考虑SPFA+Heap,

luogu P2047 社交网络

P2047 社交网络 2017-09-17 题目描述 在社交网络(social network)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之间有不同程度的关系.我 们将这个关系网络对应到一个n个结点的无向图上,两个不同的人若互相认识,则在他们对应的结点之间连接一条无向边,并附上一个正数权值c,c越小,表示两 个人之间的关系越密切. 我们可以用对应结点之间的最短路长度来衡量两个人s和t之间的关系密切程度,注意到最短路径上的其他结点为s和

bzoj 1491: [NOI2007]社交网络

Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这个关系网络对应到一个n个结点的无向图上, 两个不同的人若互相认识,则在他们对应的结点之间连接一条无向边,并附上一个正数权值c,c越小,表示两个人 之间的关系越密切.我们可以用对应结点之间的最短路长度来衡量两个人s和t之间的关系密切程度,注意到最短路 径上的其他结点为s和t的联系提供了某种便利,即这些

Up to 8% free bonus for runescape 2007 gp on Rsorder as july best gift&Enjoy Telos During 7.1-7.22

Now, a small band of freedom fighters struggle to end the osrs gold  long, dark night of Daein's oppression. The big blog news of the day is that Vox Media has acquired Curbed Network. As an amulet you should be wearing an amulet of glory and if you

FDA Approves First Hepatitis B Viral Load Test on 2007

FDA Approves First Hepatitis B Viral Load Test Another Roche first in TaqMan real-time PCR testing for the diagnostic lab The U.S. Food & Drug Administration (FDA) has approved the Roche COBAS TaqManHBV Test, the first assay for quantitating hepatiti