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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)

發布時間:2025/3/16 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
帶權圖分為有向和無向,無向圖的最短路徑又叫做最小生成樹,有prime算法和kruskal算法;有向圖的最短路徑算法有dijkstra算法和floyd算法。

  生成樹的概念:聯通圖G的一個子圖如果是一棵包含G的所有頂點的樹,則該子圖稱為G的生成樹 生成樹是聯通圖的極小連通子圖。所謂極小是指:若在樹中任意增加一條邊,則 將出現一個回路;若去掉一條邊,將會使之編程非連通圖。生成樹各邊的權 值總和稱為生成素的權。權最小的生成樹稱為最小生成樹,常用的算法有prime算法和kruskal算法。

  最短路徑問題旨在尋找圖中兩節點之間的最短路徑,常用的算法有:floyd算法和dijkstra算法。

?

  構造最小生成樹一般使用貪心策略,有prime算法和kruskal算法

  prime算法的基本思想

1.清空生成樹,任取一個頂點加入生成樹

2.在那些一個端點在生成樹里,另一個端點不在生成樹里的邊中,選取一條權最小的邊,將它和另一個端點加進生成樹

3.重復步驟2,直到所有的頂點都進入了生成樹為止,此時的生成樹就是最小生成樹

int prime(int cur) {int index;int sum = 0;memset(visit, false, sizeof(visit));visit[cur] = true;for(int i = 0; i < m; i ++){dist[i] = graph[cur][i]; }for(int i = 1; i < m; i ++){int mincost = INF;for(int j = 0; j < m; j ++){if(!visit[j] && dist[j] < mincost){mincost = dist[j];index = j; } }visit[index] = true;sum += mincost;for(int j = 0; j < m; j ++){if(!visit[j] && dist[j] > graph[index][j]){dist[j] = graph[index][j];} } } return sum; }
kruskal算法:構造一個只含n個頂點,而邊集為空的子圖,若將該子圖中各個頂點看成是各棵樹的根節點,則它是一個含有n棵樹的森林 。之后,從網的邊集中選取一條權值最小的邊,若該邊的兩個頂點分屬不同的樹 ,則將其加入子圖,也就是這兩個頂點分別所在的 兩棵樹合成一棵樹;反之,若該邊的兩個頂點已落在同一棵樹上,則不可取,而應該取下一條權值最小的邊再試之。依次類推,直至森林只有一棵樹。kruskal算法能夠在并查集的基礎很快的實現。

#include<iostream> #include<algorithm> using namespace std;const int size = 128; int n; int father[size]; int rank[size];//把每條邊成為一個結構體,包括起點、終點和權值 typedef struct node {int val;int start;int end; }edge[SIZE * SIZE / 2];//把每個元素初始化為一個集合 void make_set() {for(int i = 0; i < n; i ++){father[i] = i;rank[i] = 1; } return ; }//查找一個元素所在的集合,即找到祖先 int find_set(int x) {if(x != father[x]){father[x] = find_set(father[x]); } return father[x]; }//合并x,y所在的兩個集合:利用Find_Set找到其中兩個 //集合的祖先,將一個集合的祖先指向另一個集合的祖先。 void Union(int x, int y) {x = find_set(x); y = find_set(y);if(x == y){return ; }if(rank[x] < rank[y]){father[x] = find_set(y); }else{if(rank[x] == rank[y]){rank[x] ++; } father[y] = find_set(x);}return ; }bool cmp(pnode a, pnode b) {return a.val < b.val; }int kruskal(int n) //n為邊的數量 {int sum = 0;make_set();for(int i = 0; i < n; i ++){ //從權最小的邊開始加進圖中 if(find_set(edge[i].start) != find_set(edge[i].end)){Union(edge[i].start, edge[i].end);sum += edge[i].val; } }return sum; }int main() {while(1){scanf("%d", &n); if(n == 0){break; }char x, y;int m, weight;int cnt = 0;for(int i = 0; i < n - 1; i ++){cin >> x >> m; //scanf("%c %d", &x, &m); //printf("%c %d ", x, m);for(int j = 0; j < m; j ++){cin >> y >> weight; //scanf("%c %d", &y, &weight);//printf("%c %d ", y, weight); edge[cnt].start = x - 'A';edge[cnt].end = y - 'A';edge[cnt].val = weight;cnt ++;}}sort(edge, edge + cnt, cmp); //對邊按權從小到大排序 cout << kruskal(cnt) << endl; } }
最短路徑問題旨在尋找圖中兩節點之間的最短路徑,常用的算法有:floyd算法和dijkstra算法。

  floyd算法是最簡單的最短路徑算法,可以計算圖中任意兩點間的最短路徑? folyd算法的時間復雜度是O(N^3),如果是一個沒有邊權的圖,把相連的兩點? 間的距離設為dist[i][j] = 1,不相連的兩點設為無窮大,用 floyd算法可以判斷i,j兩點是否有路徑相連。

void floyd() {for(int k = 0; k < n; k ++){ //作為循環中間點的k必須放在最外一層循環 for(int i = 0; i < n; i ++){for(int j = 0; j < n; j ++){if(dist[i][j] > dist[i][k] + dist[k][j]){dist[i][j] = dist[i][k] + dist[k][j]; //dist[i][j]得出的是i到j的最短路徑 } } } } }

dijkstra算法用來計算從一個點到其他所有點的最短路徑的算法,復雜度O(N^2)。

void dijkstra(int s) //s是起點 {memset(visit, false, sizeof(visit)); visit[s] = true;for(int i = 0; i < n; i ++){dist[i] = graph[s][i];}int index;for(int i = 1; i < n; i ++){int mincost = INF;for(int j = 0; j < n; j ++){if(!visit[j] && dist[j] < mincost){mincost = dist[j];index = j; } }visit[index] = true;for(int j = 0; j < n; j ++){if(!visit[j] && dist[j] > dist[index] + graph[index][j]){dist[j] = dist[index] + graph[index][j];} } } }




總結

以上是生活随笔為你收集整理的最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 成人婷婷| ts人妖另类精品视频系列 | 中文字幕 人妻熟女 | 九一国产精品 | 高潮久久久 | 香港台湾日本三级大全 | 狠狠爱免费视频 | 在线日韩亚洲 | 伊人久久九| 国产精品天天看 | 欧洲av一区二区 | 美女操出白浆 | 国产一区二区在线播放 | 九九一级片 | 午夜香蕉 | 久久久无码精品亚洲国产 | 老熟妇仑乱一区二区视频 | 嫩草av在线| 国产综合视频一区二区 | 91一区二区在线观看 | 蜜桃精品视频在线 | 亚洲九九视频 | 一区二区视频网 | 亚洲人成无码网站久久99热国产 | 日韩人成 | xxxx久久 | 亚洲国产精品成人av | 日韩 国产| 国产亚洲AV无码成人网站在线 | 亚洲午夜免费 | 日韩一区二区毛片 | 欧美一二三区在线观看 | 国产精品国产 | 国产精品高清在线 | 国内久久精品视频 | 免费在线观看的黄色网址 | 一区二区三区在线 | 久久久久久久久久久久Av | www.久久爱 | 肥臀浪妇太爽了快点再快点 | 亚洲精品久久久狠狠狠爱 | 亚洲精品一区二区在线 | 人人人草 | 青青视频一区二区 | 热热热热色 | 国产99久久久国产精品免费看 | 国产精品操 | 狠狠爱婷婷 | 久久av喷吹av高潮av萌白 | 午夜性剧场 | 欧美 日韩 国产 一区二区三区 | av片国产| 韩国视频一区 | 久久婷香 | 综合久久久 | 国产免费黄色网址 | 精品乱码一区二区三区 | 亚洲另类色综合网站 | 久久伊人网站 | 欧美猛交xxx | 黄色欧美网站 | 天堂av8在线 | 久久精品欧美日韩 | 亚洲中文字幕无码一区 | 国产色区| 人人干在线视频 | 亚洲男人第一天堂 | 欧美精品在线视频观看 | 草草色 | 日本wwwxxx| 色婷网 | 好吊妞这里有精品 | 久久婷五月 | 欧美日韩另类在线 | 中文字幕精品一区二区精品 | 96久久久| 欧美日韩国产不卡 | 日本乱码一区二区 | 久久夜色精品国产噜噜亚洲av | 国产精品99999 | 小h片在线观看 | 中文字幕在线日本 | 天天色天天干天天 | 日本在线观看视频网站 | 亚洲综合网在线观看 | 嫩草网站入口 | 好男人在线观看 | 亚洲av无码成人精品国产 | 东方伊甸园av在线 | 少妇又紧又深又湿又爽视频 | 6080一级片| 色综合中文字幕 | 国产精品无码人妻一区二区在线 | 偷偷久久 | 69精品无码成人久久久久久 | 69综合| 久久婷婷色综合 | 国产a免费观看 | 亚洲小说春色综合另类 |