邻接表实现prim
2016-11-16 20:44
375 查看
///*******linjiebiao************************* #include<iostream> #include<cstdio> #include<windows.h> using namespace std; const int inf = 65535; typedef struct arcnode{///存边 int adjvex; int weight; arcnode *nextarc;///指向下一条边的指针 }arcnode; typedef struct vnode{///存点 int data; arcnode *firstarc; }vnode, Adjvex[20]; typedef struct{///存图 int vexnum, arcnum;///节点数 和 边数 Adjvex vertices;///存放图中节点信息的数组 }ALGraph; typedef struct Minimum{///存各节点的最小权值信息 int data; ///相当于之前写过的邻接矩阵方法里面的low[] int lowcost; int flag; }Minimum, closedge[20]; int LocateVex(ALGraph G, int u){ for(int i=0; i<G.vexnum; i++){ if(G.vertices[i].data == u) return i; } return 0; } void CreateGraph(ALGraph &G){ int v1, v2; int w; arcnode *p, *q; cin >> G.vexnum; cin >> G.arcnum; for(int i=0; i<G.vexnum; i++){ cin >> G.vertices[i].data; G.vertices[i].firstarc = NULL; } for(int i=0; i<G.arcnum; i++){ p = new arcnode; q = new arcnode; if(p==NULL || q==NULL){ return ; } int k, j; cin >> v1 >> v2 >> w; k = LocateVex(G, v1); j = LocateVex(G, v2); p->nextarc = G.vertices[k].firstarc; q->nextarc = G.vertices[j].firstarc; G.vertices[k].firstarc = p; p->weight = w;///e.cost p->adjvex = j;///相当于之前写的 e.to G.vertices[j].firstarc = q; q->weight = w; q->adjvex = k; } } int minimum(ALGraph G, closedge MinEdge){///发现了么 数组结构体声明的是数组 int first; int k; int i; int min; for(i=0; i<G.vexnum; i++){ if(MinEdge[i].lowcost != 0){ min = MinEdge[i].lowcost; first = i; break; } } k = i; for(i=first; i<G.vexnum; i++){ if(min>MinEdge[i].lowcost && MinEdge[i].lowcost !=0){ min = MinEdge[i].lowcost; k = i; } } return k; } int MinSpanTree(ALGraph G, int u){ int ans = 0; arcnode *p; closedge MinEdge; int k = LocateVex(G, u); for(int i=0; i<G.vexnum; i++) MinEdge[i].flag = 0; for(int i=0; i<G.vexnum; i++){ if(i!=k){ MinEdge[i].data = u; for(p=G.vertices[i].firstarc; p!=NULL; p = p->nextarc){ if(p->adjvex == k){ MinEdge[i].lowcost = p->weight; MinEdge[i].flag = 1; } else if(MinEdge[i].flag == 0){ MinEdge[i].lowcost = inf; } } } MinEdge[k].data = G.vertices[k].data; MinEdge[k].lowcost = 0;///添加完了 } for(int i=1; i<G.vexnum; i++){ k = minimum(G, MinEdge); cout<<G.vertices[k].data<<" "<<MinEdge[k].data<<" "<<MinEdge[k].lowcost<<endl; ans += MinEdge[k].lowcost; MinEdge[k].lowcost=0; //将结点加入U中 for(p=G.vertices[k].firstarc;p!=NULL;p=p->nextarc){ if(MinEdge[p->adjvex].lowcost>p->weight){ MinEdge[p->adjvex].lowcost=p->weight; MinEdge[p->adjvex].data=G.vertices[k].data; } } } return ans; } int main(){ ALGraph G; cout << "1" << endl; CreateGraph(G); int ans = MinSpanTree(G, G.vertices[0].data); cout << ans << endl; return 0; } /* 7 9 1 2 3 4 5 6 7 1 2 28 1 6 10 2 3 16 2 7 14 3 4 12 4 5 22 4 7 18 5 6 25 5 7 24 */ 99
相关文章推荐
- 邻接表实现 prim
- 以邻接表为存储结构的---图的算法实现
- 图的遍历和生成树求解实现|图遍历,生成树,实现,邻接矩阵,邻接表,深度广度遍历,最小生成树
- 图的基本算法实现(邻接矩阵与邻接表两种方法)
- 将图读进邻接表实现文件C语言
- POJ 2377 最大生成树 prim实现
- 邻接表生成模型实现文件C语言
- 图的基本算法实现(邻接矩阵与邻接表两种方法)
- pku2135 最小费用最大流 EK算法 邻接表实现
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 有向图的邻接表的建立和个类算法的实现
- 十字链表 邻接表实现各种操作
- 用邻接表表示图【java实现】
- 图的基本算法实现(邻接矩阵与邻接表两种方法)
- MATLAB版本实现的Prim 和Kruskal算法
- 邻接表实现图的遍历
- 最大流(邻接表实现)
- 用邻接表的存储结构实现迪杰斯特拉算法
- 图的基本算法实现(邻接矩阵与邻接表两种方法)
- C++实现矩阵图的遍历·最小生成树(prim,kruskal)·最短路径(Dijkstra,floyd)