BZOJ1491 NOI2007 社交網路

2022-05-08 07:45:07 字數 2491 閱讀 8763

在社交網路(socialnetwork)的研究中,我們常常使用圖論概念去解釋一些社會現象。不妨看這樣的乙個問題。

在乙個社交圈子裡有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)有意義,我們規定需要處理的社交網路都是連通的無向圖

,即任意兩個結點之間都有一條有限長度的最短路徑。現在給出這樣一幅描述社交網路的加權無向圖,請你求出每

乙個結點的重要程度。

輸入第一行有兩個整數n和m,表示社交網路中結點和無向邊的數目。在無向圖中,我們將所有結點從1到n進行編號

。接下來m行,每行用三個整數a,b,c描述一條連線結點a和b,權值為c的無向邊。注意任意兩個結點之間最多有

一條無向邊相連,無向圖中也不會出現自環(即不存在一條無向邊的兩個端點是相同的結點)。n≤100;m≤4500 

,任意一條邊的權值 c 是正整數,滿足:1≤c≤1000。所有資料中保證給出的無向圖連通,且任意兩個結點之間

的最短路徑數目不超過 10^10

輸出包括n行,每行乙個實數,精確到小數點後3位。第i行的實數表示結點i在社交網路中的重要程度。

4 41 2 1

2 3 1

3 4 1

4 1 1

1.000

1.000

1.000

1.000

社交網路如下圖所示。

對於 1 號結點而言,只有 2 號到 4 號結點和 4 號到 2 號結點的最短路經過 1 號結點,而 2 號結點和 4 號結

點之間的最短路又有 2 條。因而根據定義,1 號結點的重要程度計算為 1/2 + 1/2 = 1 。由於圖的對稱性,其他

三個結點的重要程度也都是 1 。

正解:floyd

解題報告:

n<=100,想怎麼亂搞怎麼亂搞。。。

floyd求出兩點間的最短路,順便統計一下有多少條不同的最短路。

然後第二遍再做的時候,按照定義統計一下每個結點的重要度ans[i],如果經過k存在i到j的最短路,那麼ans[k]需要加入這次的貢獻,順便統計一下就可以了。

1

//it is made by jump~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13#ifdef win32

14#define ot "%i64d"

15#else

16#define ot "%lld"

17#endif

18using

namespace

std;

19 typedef long

long

ll;20

const

int maxn = 150;21

intn,m;

22int

w[maxn][maxn];

23double

num[maxn][maxn];

24double

ans[maxn];

2526 inline int

getint()

2735

36 inline void

work()

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

44for(int i=1;i<=n;i++)

45if(i!=k)

46for(int j=1;j<=n;j++)

47if(j!=k && j!=i)

52else

if(w[i][j]==w[i][k]+w[k][j]) num[i][j]+=num[i][k]*num[k][j];53}

5455

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

56for(int i=1;i<=n;i++) if(i!=k)

57for(int j=1;j<=n;j++)

58if(j!=k && j!=i)

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

%.3lf\n

",ans[i]);62}

6364

intmain()

65

BZOJ 1491 NOI2007 社交網路

顯然這是一道要求多源最短路的題目,資料範圍很小,目測用弗洛伊德演算法。由題意,先求出各個點之間的最短路徑,同時利用乘法原理,計算出由 i 到 j 之間的最短路徑個數。如果又發現了一條最短路,由乘法原理計算增加的路徑個數再加上即可。我寫的 沒有去除自己到自己的路徑,因此需清空,但也可在 floyd 中...

BZOJ 1491 NOI2007 社交網路

傳送門 資料範圍很小,我們考慮floyd。要求的是路徑條數,所以我們在floyd的時候直接預處理出兩點之間的路徑條數。用num i j 表示,然後floyd的時候,如果dis i j include include include using namespace std const int maxn...

BZOJ 1491 NOI2007 社交網路

鏈結 我是鏈結,點我呀 題意 在這裡輸入題意 題解 floyd演算法 算出任意兩點之間的最短路,以及最短路的條數。然後三重迴圈列舉v,s,t就好 看看s到t的最短路徑不經過v 經過的話增加答案貢獻 o n 3 include include define ll long long using nam...