在社交網路(social network)的研究中,我們常常使用圖論概念去解釋一些社會現象。不妨看這樣的乙個問題。在乙個社交圈子裡有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)有意義,我們規定需要處理的社交網路都是連通的無向圖,即任意兩個結點之間都有一條有限長度的最短路徑。
現在給出這樣一幅描述社交網路s的加權無向圖,請你求出每乙個結點的重要程度。
輸入中第一行有兩個整數,n和m,表示社交網路中結點和無向邊的數目。在無向圖中,我們將所有結點從1到n進行編號。
接下來m行,每行用三個整數a, b, c描述一條連線結點a和b,權值為c的無向邊。注意任意兩個結點之間最多有一條無向邊相連,無向圖中也不會出現自環(即不存在一條無向邊的兩個端點是相同的結點)。
輸出包括n行,每行乙個實數,精確到小數點後3位。第i行的實數表示結點i在社交網路中的重要程度。
題解:**:
#include#include#include
#include
#include
#include
const
int maxn=150
;using
namespace
std;
intdis[maxn][maxn];
double
num[maxn][maxn];
double
ans[maxn];
intn,m;
void
cl()
intmain()
for(int k=1;k<=n;k++)
else
if(dis[i][j]==dis[i][k]+dis[k][j])
num[i][j]+=num[i][k]*num[k][j];}}
}for(int k=1;k<=n;k++)}}
for(int i=1;i<=n;i++) printf("
%0.3f\n
",ans[i]);
}
NOI2007 社交網路
bzoj1491 noi2007 社交網路 看到資料規模,最先想到的是floyd,但在統計方案的地方卡住了。瀏覽了幾篇題解,得到了一點啟示。在floyd過程中,列舉k為中轉點 如果當前需要更新,那麼經過k的最短路條數附初始值為兩邊 i k和k j 的條數之積 乘法原理 如果恰巧當前就是一條最短路,那...
noi2007 社交網路
給定乙個由n個點組成的無向圖,求所有點的 v x sum a ne b 其中 c a,b 表示 a,b 這條最短路路徑的條數,c a,b v 表示 a,b 最短路中經過v的最短路的條數。n le 100 這道題要分三個子問題 求出ab距離,求出ab最短路條數,求出ab最短路中,經過v的條數。如果第二...
NOI2007 社交網路
題目 洛谷p2047 bzoj1491 vijos p1591 codevs1796。題目大意 給你一張帶權無向圖。令 c 表示從s到t的不同的最短路的數目,c v 表示經過v從s到t的不同的最短路的數目。則定義 為節點v的重要程度。問每個節點的重要程度 保留3位小數 解題思路 用floyd求出每個...