在社交網路(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...