最小生成树之PRIM算法
问题:经典的就是最简单的。
用到两个数组:lowcost[] 和 closeset[],前者用来记录U集合和V集合的最小边,后者用来记录最小边的起始顶点。
代码:
#include <iostream> #include <cstdlib> using namespace std; #define MAXV 20 #define INFINITY 65535 typedef struct map { char vex[MAXV]; int arr[MAXV][MAXV]; int vexs,edges; }*mapNode; int locatePos(mapNode mn, char c) { int i; for (i=0;i<mn->vexs;i++) { if (mn->vex[i]==c) return i; //break; } return -1; } void createMap(mapNode &map) { char c,d; int p,q,w; cout<< "please input vexs and edges:" ; cin>>map->vexs>>map->edges; cout<< "初始化图:" <<endl; for ( int i=0;i<map->vexs;i++) { for ( int j=0;j<map->vexs;j++) { map->arr[i][j]=INFINITY; } } cout<< "输入顶点字符:" <<endl; for ( int k=0;k<map->vexs;k++) { cin>>map->vex[k]; } getchar (); for ( int i=0;i<map->edges;i++) { cout<< "please input two char:" ; cin>>c>>d; p=locatePos(map,c); q=locatePos(map,d); if (p==-1||q==-1) { cout<< "input error" <<endl; } else { cout<< "please input weight:" ; cin>>w; map->arr[p][q]=w; map->arr[q][p]=w; } } } void showMap(mapNode map) { for ( int i=0;i<map->vexs;i++) { for ( int j=0;j<map->vexs;j++) { cout<<map->arr[i][j]<< " " ; } cout<<endl; } } void MST_prim(mapNode map) { int w=0; //记录最小生成树的权值 int min; int lowcost[MAXV]; //记录U集合到V集合的最小边 int closeset[MAXV]; //记录U集合到V集合的起点 int f[MAXV]; int i,k,j; int temp; for (i=1;i<map->vexs;i++) { f[i]=1; //V集合 closeset[i]=0; } f[0]=0; //从第一个顶点开始 for (j=0;j<map->vexs;j++) lowcost[j]=map->arr[0][j]; for (k=1;k<=map->vexs-1;k++) //k个顶点至少k-1条边 { temp=0; min=INFINITY; for (i=1;i<map->vexs;i++) //找出U集合到V集合的最小边 { if ((f[i]!=0)&&(lowcost[i]<min)) { min=lowcost[i]; temp=i; } } cout<< "(" <<map->vex[closeset[temp]]<< "," <<map->vex[temp]<< ")" << " " ; w+=min; f[temp]=0; //加入到U集合 for (j=1;j<map->vexs;j++) //更新边集合,使U集合到V集合的边权值最小 { if ((f[j]!=0)&&(map->arr[temp][j]<lowcost[j])) { lowcost[j]=map->arr[temp][j]; closeset[j]=temp; } } } cout<< "最小生成树权值为:" <<w<<endl; } int main() { mapNode map; map=(mapNode) malloc ( sizeof ( struct map)); cout<< "创建无向图:" <<endl; createMap(map); cout<< "输出无向图:" <<endl; showMap(map); cout<<endl; MST_prim(map); return 0; } |
运行截图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述