生活随笔
收集整理的這篇文章主要介紹了
图Graph--寻找二度好友(BFS应用)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
社交網(wǎng)絡(luò)可以用圖來表示(查閱圖的概念)。
尋找二度好友,這個(gè)問題就非常適合用圖的廣度優(yōu)先搜索BFS算法來解決,因?yàn)閺V度優(yōu)先搜索是層層往外推進(jìn)的。
- 首先,遍歷與起始頂點(diǎn)最近的一層頂點(diǎn),也就是用戶的一度好友
- 然后再遍歷與用戶距離的邊數(shù)為2的頂點(diǎn),也就是二度好友關(guān)系
- 只需要稍加改造一下廣度優(yōu)先搜索代碼,用一個(gè)數(shù)組來記錄每個(gè)頂點(diǎn)與起始頂點(diǎn)的距離,非常容易就可以找出二度好友關(guān)系
例如有如上好友關(guān)系網(wǎng)絡(luò),打印某人的n度好友。
#include <iostream>
#include <queue>
#include <memory.h>using namespace std
;
#define MaxNum 20
#define MaxValue 65535
class arrGraph
{
public:char vertex
[MaxNum
]; int GType
; int v
; int e
; int ew
[MaxNum
][MaxNum
]; int visited
[MaxNum
]; int distance
[MaxNum
]; arrGraph(int vertexNum
, int edgeNum
, int gt
= 0){v
= vertexNum
;e
= edgeNum
;GType
= gt
;clearGraph();memset(distance
,0,sizeof(int)*v
);}void creatGraph(){int i
, j
, k
;int weight
;char startV
, endV
;cout
<< "輸入圖中各頂點(diǎn)的信息:" << endl
;for(i
= 0; i
< v
; ++i
){cout
<< "第" << i
+1 << "個(gè)頂點(diǎn):";cin
>> vertex
[i
];}cout
<< "輸入各邊的起點(diǎn),終點(diǎn),權(quán)值:" << endl
;for(k
= 0; k
< e
; ++k
){cout
<< "第" << k
+1 << "條邊:";cin
>> startV
>> endV
>> weight
;for(i
= 0; startV
!= vertex
[i
]; ++i
); for(j
= 0; endV
!= vertex
[j
]; ++j
); ew
[i
][j
] = weight
; if(GType
== 0)ew
[j
][i
] = weight
; }}void clearGraph(){int i
, j
;for(i
= 0; i
< v
; ++i
)for(j
= 0; j
< v
; ++j
)ew
[i
][j
] = MaxValue
; }int findPos(char ch
){int i
;for(i
= 0; i
< v
&& ch
!= vertex
[i
]; ++i
);return i
;}void find_friend_bfs(char s
, size_t d
){memset(distance
,0,sizeof(int)*v
);int i
, k
;size_t dist
= 1;for(i
= 0; i
< v
; ++i
)visited
[i
] = 0;i
= findPos(s
);if(i
>= v
)return;visited
[i
] = 1;queue
<char> q
;q
.push(s
);while(!q
.empty()){char w
= q
.front();q
.pop();k
= findPos(w
);for(i
= 0; i
< v
; ++i
){if(ew
[k
][i
] != MaxValue
&& !visited
[i
]){visited
[i
] = 1;q
.push(vertex
[i
]);distance
[i
] = distance
[k
]+1;}}}cout
<< s
<< "的" << d
<< "度好友如下:" << endl
;for(i
= 0; i
< v
; ++i
) {if(distance
[i
] == d
)cout
<< vertex
[i
] << " ";}cout
<< endl
;}
};int main()
{arrGraph
ag(10,14); ag
.creatGraph();cout
<< endl
;ag
.find_friend_bfs('A',1); ag
.find_friend_bfs('A',2); ag
.find_friend_bfs('A',3); ag
.find_friend_bfs('A',4); ag
.find_friend_bfs('I',2); return 0;
}
總結(jié)
以上是生活随笔為你收集整理的图Graph--寻找二度好友(BFS应用)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。