日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

图Graph--寻找二度好友(BFS应用)

發(fā)布時(shí)間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图Graph--寻找二度好友(BFS应用) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

社交網(wǎng)絡(luò)可以用圖來(lái)表示(查閱圖的概念)。
尋找二度好友,這個(gè)問(wèn)題就非常適合用圖的廣度優(yōu)先搜索BFS算法來(lái)解決,因?yàn)閺V度優(yōu)先搜索是層層往外推進(jìn)的。

  • 首先,遍歷與起始頂點(diǎn)最近的一層頂點(diǎn),也就是用戶的一度好友
  • 然后再遍歷與用戶距離的邊數(shù)為2的頂點(diǎn),也就是二度好友關(guān)系
  • 只需要稍加改造一下廣度優(yōu)先搜索代碼,用一個(gè)數(shù)組來(lái)記錄每個(gè)頂點(diǎn)與起始頂點(diǎn)的距離,非常容易就可以找出二度好友關(guān)系


例如有如上好友關(guān)系網(wǎng)絡(luò),打印某人的n度好友。

/*** @description: 利用圖的BFS廣度搜索查找二度好友* @author: michael ming* @date: 2019/6/13 0:32* @modified by: */ #include <iostream> #include <queue> #include <memory.h>using namespace std; #define MaxNum 20 //最大頂點(diǎn)數(shù) #define MaxValue 65535 //最大值(標(biāo)記矩陣空位) class arrGraph //鄰接矩陣圖 { public:char vertex[MaxNum]; //頂點(diǎn)信息int GType; //圖的類型(0無(wú)向圖,1有向圖)int v; //頂點(diǎn)個(gè)數(shù)int e; //邊數(shù)量int ew[MaxNum][MaxNum]; //邊的權(quán)重int visited[MaxNum]; //訪問(wèn)標(biāo)志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;//循環(huán)用計(jì)數(shù)器int weight;//權(quán)重char startV, endV;//邊的起始終止點(diǎn)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); //查找起點(diǎn)for(j = 0; endV != vertex[j]; ++j); //終點(diǎn)ew[i][j] = weight; //權(quán)值,一條邊 i->jif(GType == 0)ew[j][i] = weight; //無(wú)向圖,對(duì)稱位置一樣的權(quán)}}void clearGraph(){int i, j;for(i = 0; i < v; ++i)for(j = 0; j < v; ++j)ew[i][j] = MaxValue; //清空矩陣(每個(gè)值置為MaxValue)}int findPos(char ch){int i;for(i = 0; i < v && ch != vertex[i]; ++i);//找到ch的位置ireturn i;}void find_friend_bfs(char s, size_t d)//從s開始廣度遍歷搜索 d 度好友{memset(distance,0,sizeof(int)*v);int i, k;size_t dist = 1;//好友距離(度)for(i = 0; i < v; ++i)visited[i] = 0;//訪問(wèn)標(biāo)志置0i = 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;//每個(gè)未訪問(wèn)點(diǎn)的距離是前一個(gè)訪問(wèn)點(diǎn)距離+1}}}cout << s << "的" << d << "度好友如下:" << endl;for(i = 0; i < v; ++i) //輸出d度好友{if(distance[i] == d)cout << vertex[i] << " ";}cout << endl;} };int main() {arrGraph ag(10,14); //10個(gè)頂點(diǎn),14條邊,默認(rèn)生成無(wú)向圖ag.creatGraph();//輸入ABCDEFGHIJ AB1BE1EG1AG1AC1BD1EF1GH1GJ1CD1DF1FH1DI1FJ1cout << endl;ag.find_friend_bfs('A',1); //查找A的1度好友ag.find_friend_bfs('A',2); //查找A的2度好友ag.find_friend_bfs('A',3); //查找A的3度好友ag.find_friend_bfs('A',4); //查找A的4度好友ag.find_friend_bfs('I',2); //查找I的2度好友return 0; }

總結(jié)

以上是生活随笔為你收集整理的图Graph--寻找二度好友(BFS应用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。