日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2024/7/5 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图Graph--寻找二度好友(BFS应用) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

社交網絡可以用圖來表示(查閱圖的概念)。
尋找二度好友,這個問題就非常適合用圖的廣度優先搜索BFS算法來解決,因為廣度優先搜索是層層往外推進的。

  • 首先,遍歷與起始頂點最近的一層頂點,也就是用戶的一度好友
  • 然后再遍歷與用戶距離的邊數為2的頂點,也就是二度好友關系
  • 只需要稍加改造一下廣度優先搜索代碼,用一個數組來記錄每個頂點與起始頂點的距離,非常容易就可以找出二度好友關系


例如有如上好友關系網絡,打印某人的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 //最大頂點數 #define MaxValue 65535 //最大值(標記矩陣空位) class arrGraph //鄰接矩陣圖 { public:char vertex[MaxNum]; //頂點信息int GType; //圖的類型(0無向圖,1有向圖)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 << "輸入圖中各頂點的信息:" << endl;for(i = 0; i < v; ++i){cout << "第" << i+1 << "個頂點:";cin >> vertex[i];}cout << "輸入各邊的起點,終點,權值:" << 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; //權值,一條邊 i->jif(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; //清空矩陣(每個值置為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;//訪問標志置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;//每個未訪問點的距離是前一個訪問點距離+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個頂點,14條邊,默認生成無向圖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; }

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。