7-36 社交网络图中结点的“重要性”计算 (30 分)(思路加详解)兄弟们PTA乙级题目冲起来
一:題目
在社交網絡中,個人或單位(結點)之間通過某些關系(邊)聯系起來。他們受到這些關系的影響,這種影響可以理解為網絡中相互連接的結點之間蔓延的一種相互作用,可以增強也可以減弱。而結點根據其所處的位置不同,其在網絡中體現的重要性也不盡相同。
“緊密度中心性”是用來衡量一個結點到達其它結點的“快慢”的指標,即一個有較高中心性的結點比有較低中心性的結點能夠更快地(平均意義下)到達網絡中的其它結點,因而在該網絡的傳播過程中有更重要的價值。在有N個結點的網絡中,結點v
i
?
的“緊密度中心性”Cc(v
i
?
)數學上定義為v
i
?
到其余所有結點v
j
?
(j
=i) 的最短距離d(v
i
?
,v
j
?
)的平均值的倒數:
對于非連通圖,所有結點的緊密度中心性都是0。
給定一個無權的無向圖以及其中的一組結點,計算這組結點中每個結點的緊密度中心性。
輸入格式:
輸入第一行給出兩個正整數N和M,其中N(≤10
4
)是圖中結點個數,順便假設結點從1到N編號;M(≤10
5
)是邊的條數。隨后的M行中,每行給出一條邊的信息,即該邊連接的兩個結點編號,中間用空格分隔。最后一行給出需要計算緊密度中心性的這組結點的個數K(≤100)以及K個結點編號,用空格分隔。
輸出格式:
按照Cc(i)=x.xx的格式輸出K個給定結點的緊密度中心性,每個輸出占一行,結果保留到小數點后2位。
輸入樣例:
9 14 1 2 1 3 1 4 2 3 3 4 4 5 4 6 5 6 5 7 5 8 6 7 6 8 7 8 7 9 3 3 4 9結尾無空行
輸出樣例:
結尾無空行
二:思路
思路:說這道題思路之前,先說一下做題的思路,任何題,我一拿到題,看到那個公式
就蒙了,但我有我自己的做題套路,那就是根據例子即輸出輸入樣例,進行代數
規律也就浮出水面。
再說這道題,仔細看關鍵字的話,這是一個單源點求取最短路徑問題 。這里沒給邊的
權值,這里是默認為 1 的 ,沒有直接連接的為無窮;
圖解:dij算法 和 prime算法
dij單源點最短路徑
prime最小生成樹
三:上碼
/**思路:說這道題思路之前,先說一下做題的思路,任何題,我一拿到題,看到那個公式就蒙了,但我有我自己的做題套路,那就是根據例子即輸出輸入樣例,進行代數規律也就浮出水面。再說這道題,仔細看關鍵字的話,這是一個單源點求取最短路徑問題 。這里沒給邊的權值,這里是默認為 1 的 */ #include<bits/stdc++.h> using namespace std; #define infinite 9999typedef struct GNode* PtrGraph; typedef struct GNode{int Nv;int Ne;int Date[10001][10001]; }gnode;int flag = 0;void createGraph(PtrGraph G){int N,M;cin >> N >> M;G->Nv = N;G->Ne = M;//矩陣初始化 for( int i = 1; i <= G->Nv; i++ ){for( int j = 0; j <= G->Nv; j++ ){if( i == j )G->Date[i][j] = 0;elseG->Date[i][j] = infinite;} } //矩陣賦值for( int i = 1; i <= G->Ne; i++ ){int a,b;cin >> a >> b;G->Date[a][b] = 1;G->Date[b][a] = 1;} } //dij算法 int dijGraph( PtrGraph G ,int x ){int dist[10001];//存儲 指定結點到其他結點的距離int visited[10001] = {0};int count = 0;//記錄節點數 int sum = 0;for( int i = 1; i <= G->Nv; i++){dist[i] = G->Date[x][i]; } visited[x] = 1;count++;//已經統計了 x 結點//找最小值 和 更新 while( 1 ){int m = -1;int min = infinite;for( int i = 1; i <= G->Nv; i++ ){if( visited[i] != 1 &&dist[i] < min ){min = dist[i];m = i;}}if( m == -1 ){break;}count++;visited[m] = 1;for( int i = 1; i <= G->Nv; i++ ){if( visited[i] != 1 && min + G->Date[m][i] < dist[i] ){dist[i] = min + G->Date[m][i];}}} if( count != G->Nv ){flag = 1;}for( int i = 1; i <= G->Nv; i++ ){sum += dist[i];}return sum;} int main(){PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));createGraph(G);int K;cin >> K;for( int i = 0; i < K; i++ ){int temp1,temp2;cin >> temp1;temp2 = dijGraph(G,temp1);// cout << temp2 << endl;if( flag == 0){double temp3 = (double)(G->Nv - 1) / temp2; printf("Cc(%d)=%0.2f\n",temp1,temp3);}else{printf("Cc(%d)=0.00\n",temp1);}} } //9 13 //1 2 //1 3 //1 4 //2 3 //3 4 //4 5 //4 6 //5 6 //5 7 //5 8 //6 7 //6 8 //7 8 //3 3 4 9四:加油沖呀
·1:附帶數據結構和算法導圖一,別問,問就是嫖的,自己覺得蠻有用的,用來查漏補缺
總結
以上是生活随笔為你收集整理的7-36 社交网络图中结点的“重要性”计算 (30 分)(思路加详解)兄弟们PTA乙级题目冲起来的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电动平板车的维护保养方案电动汽车维保方案
- 下一篇: 7-37 模拟EXCEL排序 (25 分