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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

由最小生成树算法改到最短路径算法代码----为了区分两者的区别

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 由最小生成树算法改到最短路径算法代码----为了区分两者的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前幾天考試,最后一題是有關(guān)最小生成樹的,但是由于好久沒有看數(shù)據(jù)結(jié)構(gòu)了,把最小生成樹和最短路徑算法搞混了 (二者本來就很相近)。今天首先寫了最小生成樹的算法,

然后將其代碼復(fù)制粘貼,在原來的基礎(chǔ)上稍作修改,就變成了最短路徑算法。(二者最大的區(qū)別應(yīng)該是對(duì)某一個(gè)標(biāo)志數(shù)組的更新上,最小生成樹是將集合V中的點(diǎn),更新為到集合U中任意一點(diǎn)的最短距離,而最短路徑則是將集合V中點(diǎn)更新為到源點(diǎn)的最短距離)。并且采用了同一個(gè)測(cè)試用例。

? 希望對(duì)這兩種算法模糊的同學(xué)起到一定的幫助作用,下面是最小生成樹代碼


//最小生成樹 /* 6 0 6 1 5 0 0 6 0 5 0 3 0 1 5 0 5 6 4 5 0 5 0 0 2 0 3 6 0 0 6 0 0 4 2 6 0 */#include <stdio.h> #include<string.h> #define MAX_SIZE 100int n ; int closedge[MAX_SIZE]; int min_road(int a[]);int main (){int sum;int i, j ;int G[MAX_SIZE][MAX_SIZE];scanf("%d",&n);for (i = 0 ; i < n ; i ++)for ( j = 0 ; j < n ; j++){scanf("%d",&G[i][j]);if (G[i][j]==0)G[i][j]=0x7fffffff;}sum = MinSpanTree_prim(G , 0);printf("總花費(fèi) = %d\n",sum);return 0;}int MinSpanTree_prim(int G[][MAX_SIZE] ,int v){int i,j;int sum = 0 ;//總花費(fèi)int new_point ;//新節(jié)點(diǎn)for ( i = 0 ; i < n ; i ++){closedge[i] = G[v][i];}closedge[v] = 0;printf("%d\n",v);for (i = 1 ; i < n ; i++){new_point = min_road(closedge);//從數(shù)組中找出最小的非零邊,沒有返回-1printf("%d\n",new_point);if (new_point^-1){sum += closedge[new_point] ;closedge[new_point] = 0 ;//加入生成樹}else{printf("圖不連通\n");}for ( j = 0 ; j < n ; j ++){if (closedge[j] && G[new_point][j]){closedge[j] = G[new_point][j]<closedge[j]?G[new_point][j]:closedge[j];}// printf(" %d ",closedge[j]);}printf("\n");}return sum;} int min_road(int a[]){int min = 0x7fffffff ;int v = -1 , i ;for ( i = 0 ; i< n ; i++){if (closedge[i] && closedge[i]<min){min = closedge[i] ;v = i ;}}return v;}

最短路徑算法代碼:


//最段路徑 /* 6 0 6 1 5 0 0 6 0 5 0 3 0 1 5 0 5 6 4 5 0 5 0 0 2 0 3 6 0 0 6 0 0 4 2 6 0 */#include <stdio.h> #include<string.h> #define MAX_SIZE 100int n ; int closedge[MAX_SIZE];//記錄各點(diǎn)到源點(diǎn)的距離 int visited[MAX_SIZE] ;//記錄該點(diǎn)是否已經(jīng)加入集合V int min_road(int a[]);int main (){int sum;int i, j ;int G[MAX_SIZE][MAX_SIZE];scanf("%d",&n);for (i = 0 ; i < n ; i ++)for ( j = 0 ; j < n ; j++){scanf("%d",&G[i][j]);if (G[i][j]==0)G[i][j]=0x7fffffff;}MinSpanTree_prim(G , 0);return 0;}int MinSpanTree_prim(int G[][MAX_SIZE] ,int v){int i,j;//int sum = 0 ;//總花費(fèi)int new_point ;//新節(jié)點(diǎn)for ( i = 0 ; i < n ; i ++){visited[i] = 0;closedge[i] = G[v][i];}closedge[v] = 0;visited[v] = 1;// printf("%d\n",v);for (i = 1 ; i < n ; i++){new_point = min_road(closedge);//從數(shù)組中找出最小的非零邊,沒有返回-1// printf("%d\n",new_point);if (new_point^-1){visited[new_point] = 1;//加入集合U// sum += closedge[new_point] ;//closedge[new_point] = 0 ;//加入生成}else{printf("圖不連通\n");}for ( j = 0 ; j < n ; j ++){if ( !visited[j] && G[new_point][j]!=0x7fffffff){closedge[j] = (G[new_point][j] + closedge[new_point])<closedge[j]?(G[new_point][j] + closedge[new_point]):closedge[j];//更新集合V中的最短路徑}printf(" %d ",closedge[j]);}printf("\n");}// return sum;} int min_road(int a[]){int min = 0x7fffffff ;int v = -1 , i ;for ( i = 0 ; i< n ; i++){if (!visited[i] && closedge[i]<min){min = closedge[i] ;v = i ;}}return v;}

總結(jié)

以上是生活随笔為你收集整理的由最小生成树算法改到最短路径算法代码----为了区分两者的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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