noi2007 社交網路

2022-05-06 16:24:15 字數 1066 閱讀 5540

給定乙個由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的條數。如果第二個子問題求出來,用\(path[a][b]\)表示ab間最短路的條數,v經過ab最短路的條數就是\(dis[a][b]==dis[a][v]+dis[v][b]?path[a][v]*path[v][b]:0\)。那麼問題就是第二個問題如何解答。

如何套到floyd上求解第二個問題呢?首先想到預處理出所有點對距離,然後外層迴圈最短路中的點k,裡層列舉i,j,看看是否\(dis[i][k]+dis[k][j]==dis[i][j]\),但是這樣會把所有最短路上的點都算一遍,重複了。

所以我們有乙個方法,就是把外層迴圈k定義為列舉ij之間的最大節點為k的最短路,因此第乙個問題和第二個問題一起解決。這樣就可以和floyd完美結合了。我們從理論角度理解一下,乙個最短路,不會被k之前的外層迴圈列舉到,因為那個時候這個最短路還沒有經過k,不是聯通的,\(dis[i][j]=\infty\),而更不會被k以後的外層迴圈列舉到,因為最短路中沒有比k大的節點。世界真奇妙!

#include using namespace std;

typedef long long ll;

const ll maxn=105, inf=1e9;

ll n, m, dis[maxn][maxn], path[maxn][maxn];

int main()

for (ll k=1; k<=n; ++k)

if (dis[i][k]+dis[k][j]==dis[i][j])

path[i][j]+=path[i][k]*path[k][j];}}

double cnt=0;

for (ll k=1; k<=n; ++k)

return 0;

}

NOI2007 社交網路

bzoj1491 noi2007 社交網路 看到資料規模,最先想到的是floyd,但在統計方案的地方卡住了。瀏覽了幾篇題解,得到了一點啟示。在floyd過程中,列舉k為中轉點 如果當前需要更新,那麼經過k的最短路條數附初始值為兩邊 i k和k j 的條數之積 乘法原理 如果恰巧當前就是一條最短路,那...

NOI2007 社交網路

題目 洛谷p2047 bzoj1491 vijos p1591 codevs1796。題目大意 給你一張帶權無向圖。令 c 表示從s到t的不同的最短路的數目,c v 表示經過v從s到t的不同的最短路的數目。則定義 為節點v的重要程度。問每個節點的重要程度 保留3位小數 解題思路 用floyd求出每個...

NOI2007 社交網路

在社交網路 social network 的研究中,我們常常使用圖論概念去解釋一些社會現象。不妨看這樣的乙個問題。在乙個社交圈子裡有n個人,人與人之間有不同程度的關係。我 們將這個關係網路對應到乙個n個結點的無向圖上,兩個不同的人若互相認識,則在他們對應的結點之間連線一條無向邊,並附上乙個正數權值c...