您的位置:首页 > 其它

邻接表实现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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: