1491. [NOI2007]社交网络【最短路计数】
生活随笔
收集整理的這篇文章主要介紹了
1491. [NOI2007]社交网络【最短路计数】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
在社交網(wǎng)絡(luò)(socialnetwork)的研究中,我們常常使用圖論概念去解釋一些社會現(xiàn)象。不妨看這樣的一個問題。 在一個社交圈子里有n個人,人與人之間有不同程度的關(guān)系。我們將這個關(guān)系網(wǎng)絡(luò)對應(yīng)到一個n個結(jié)點的無向圖上, 兩個不同的人若互相認識,則在他們對應(yīng)的結(jié)點之間連接一條無向邊,并附上一個正數(shù)權(quán)值c,c越小,表示兩個人 之間的關(guān)系越密切。我們可以用對應(yīng)結(jié)點之間的最短路長度來衡量兩個人s和t之間的關(guān)系密切程度,注意到最短路 徑上的其他結(jié)點為s和t的聯(lián)系提供了某種便利,即這些結(jié)點對于s和t之間的聯(lián)系有一定的重要程度。我們可以通過 統(tǒng)計經(jīng)過一個結(jié)點v的最短路徑的數(shù)目來衡量該結(jié)點在社交網(wǎng)絡(luò)中的重要程度。考慮到兩個結(jié)點A和B之間可能會有 多條最短路徑。我們修改重要程度的定義如下:令Cs,t表示從s到t的不同的最短路的數(shù)目,Cs,t(v)表示經(jīng)過v從s 到t的最短路的數(shù)目;則定義 為結(jié)點v在社交網(wǎng)絡(luò)中的重要程度。為了使I(v)和Cs,t(v)有意義,我們規(guī)定需要處理的社交網(wǎng)絡(luò)都是連通的無向圖 ,即任意兩個結(jié)點之間都有一條有限長度的最短路徑。現(xiàn)在給出這樣一幅描述社交網(wǎng)絡(luò)的加權(quán)無向圖,請你求出每 一個結(jié)點的重要程度。Input
輸入第一行有兩個整數(shù)n和m,表示社交網(wǎng)絡(luò)中結(jié)點和無向邊的數(shù)目。在無向圖中,我們將所有結(jié)點從1到n進行編號 。接下來m行,每行用三個整數(shù)a,b,c描述一條連接結(jié)點a和b,權(quán)值為c的無向邊。注意任意兩個結(jié)點之間最多有 一條無向邊相連,無向圖中也不會出現(xiàn)自環(huán)(即不存在一條無向邊的兩個端點是相同的結(jié)點)。n≤100;m≤4500? ,任意一條邊的權(quán)值 c 是正整數(shù),滿足:1≤c≤1000。所有數(shù)據(jù)中保證給出的無向圖連通,且任意兩個結(jié)點之間 的最短路徑數(shù)目不超過 10^10Output
輸出包括n行,每行一個實數(shù),精確到小數(shù)點后3位。第i行的實數(shù)表示結(jié)點i在社交網(wǎng)絡(luò)中的重要程度。
Sample Input
4 41 2 1
2 3 1
3 4 1
4 1 1
Sample Output
1.0001.000
1.000
1.000
HINT
社交網(wǎng)絡(luò)如下圖所示。
?
?
對于 1 號結(jié)點而言,只有 2 號到 4 號結(jié)點和 4 號到 2 號結(jié)點的最短路經(jīng)過 1 號結(jié)點,而 2 號結(jié)點和 4 號結(jié) 點之間的最短路又有 2 條。因而根據(jù)定義,1 號結(jié)點的重要程度計算為 1/2 + 1/2 = 1 。由于圖的對稱性,其他 三個結(jié)點的重要程度也都是 1 。 這個題唯一的難點就是最短路計數(shù)的問題我一開始口胡的一個計數(shù)方法基本是對的,但有一個關(guān)鍵的地方出了點問題
當可以更新時,用中介點兩端的條數(shù)乘起來更新就好了(看代碼非常好理解) 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #define N (100+10) 5 using namespace std; 6 long long dis[N][N],dis_cnt[N][N]; 7 long long n,m,u,v,l; 8 9 void Floyd() 10 { 11 for (int k=1;k<=n;++k) 12 for (int i=1;i<=n;++i) 13 for (int j=1;j<=n;++j) 14 { 15 if (dis[i][k]+dis[k][j]==dis[i][j]) 16 dis_cnt[i][j]+=dis_cnt[i][k]*dis_cnt[k][j]; 17 if (dis[i][k]+dis[k][j]<dis[i][j]) 18 { 19 dis[i][j]=dis[i][k]+dis[k][j]; 20 dis_cnt[i][j]=dis_cnt[i][k]*dis_cnt[k][j]; 21 } 22 } 23 } 24 25 double Count(int v) 26 { 27 double ans=0; 28 for (int s=1;s<=n;++s) 29 for (int t=1;t<=n;++t) 30 if (s!=v && t!=v && s!=t && dis[s][v]+dis[v][t]==dis[s][t]) 31 ans+=dis_cnt[s][v]*dis_cnt[v][t]*1.0/dis_cnt[s][t]; 32 return ans; 33 } 34 35 int main() 36 { 37 memset(dis,0x3f,sizeof(dis)); 38 scanf("%lld%lld",&n,&m); 39 for (int i=1;i<=m;++i) 40 { 41 scanf("%lld%lld%lld",&u,&v,&l); 42 dis[u][v]=dis[v][u]=l; 43 dis_cnt[u][v]=dis_cnt[v][u]=1; 44 } 45 Floyd(); 46 for (int i=1;i<=n;++i) 47 printf("%0.3lf\n",Count(i)); 48 }
轉(zhuǎn)載于:https://www.cnblogs.com/refun/p/8680843.html
總結(jié)
以上是生活随笔為你收集整理的1491. [NOI2007]社交网络【最短路计数】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英伟达联合芯片巨头ARM打造IOT设备的
- 下一篇: BZOJ2816:[ZJOI2012]网