題目鏈結
這道題是一道圖論題,非常顯然,題中的目的非常明顯,就是統計最短路並求和。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,題上也給了提示。
**如下:
#includeusingview codenamespace
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;
}
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求出每個...