P2047 NOI2007 社交網路

2022-03-17 23:21:19 字數 1400 閱讀 2717

題目鏈結

這道題是一道圖論題,非常顯然,題中的目的非常明顯,就是統計最短路並求和。n<=100,一看到這個資料範圍,就可以想到n^3的floyd,但是考慮如何來求出最短路的個數?

一開始我想的是floyd預處理最短路,然後再dijkstra統計最短路個數,因為我只會dijkstra的最短路計數。由於dijkstra是單源最短路,所以這樣做的複雜度又多了乙個n。

其實用floyd就可以了,再求最短路的時候可以順便統計最短路的個數。統計最短路其實就可以用到乘法原理解決。

設dis[i][j]為i->j的最短路,way[i][j]為i->j的最短路條數,有乙個中間點k。

分類討論:

1.如果dis[i][j]>dis[i][k]+dis[k][j]。這樣就要求我們更新最短路,而從i->j的最短路條數就是way[i][k]*way[k][j]

2.如果當前路徑與最短路距離相等,那麼只需要在原基礎上累加way[i][k]*way[k][j]的值即可。

然後按題上的公式做就可以了。注意要統計路徑時要開longlong,題上也給了提示。

**如下:

#includeusing

namespace

std;

const

int maxn=1e6+7

;const

int n=550

;const

int inf=88888888

;int

mp[n][n];

long

long

way[n][n];

intn,m;

intx,y,v;

double

sum[maxn];

void

floyd()

else

if(mp[i][j]==mp[i][k]+mp[k][j]) way[i][j]+=way[i][k]*way[k][j];}}

}}

}int

main()

for(int i=1;i<=n;i++) mp[i][i]=0

;

for(int i=1;i<=m;i++)

floyd();

for(int k=1;k<=n;k++)}}

}for(int i=1;i<=n;i++) printf("

%.3lf\n

",sum[i]);

return0;

}

view code

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求出每個...