图-最小代价生成树(数据结构)
1 //最小代价生成树 2 //prim算法(稠密图):从与这棵树相连的边中选择最短的边,并将这条边及其所连顶点接入当前树中 3 void Prim(MGraph g,int v0,int &sum) { 4 int lowcost[maxsize],visit[maxsize],v;//lowcost存放当前树到其他顶点的最小权值的顶点 5 int min,k; 6 v=v0; 7 for(int i=0; i<g.n; i++) { 8 lowcost[i]=g.edges[v0][i]; 9 visit[i]=0; 10 } 11 visit[v0]=1; 12 sun=0; 13 for(int i=0; i<g.n-1; i++) { 14 min=INF;//INF是比所有权值都大的整数 15 for(int j=0; j<g.n; j++) { 16 if(visit[j]==0&&lowcost[j]<min) { 17 min=lowcost[j]; 18 k=j; 19 } 20 } 21 v=k; 22 visit[k]=0; 23 sum+=min; 24 for(int j=0; j<g->n; j++) { 25 if(visit[j]==0&&lowcost[j]>g.edges[v][j]) { 26 lowcost[j]=g.edges[v][j]; 27 } 28 } 29 } 30 } 31 32 //Kruskal算法(稀疏矩阵):每次找出候选边中权值最小的边,就将该边并入生成树中。 33 //重复此过程直到所有的边都被检测完为止 34 typedef struct Road { 35 int a,b,w;//分别表示两个顶点和路径的权值 36 }; 37 Road road[maxsize]; 38 int v[maxsize];//表示并查集 39 int getRoot(int a) { 40 if(a!=v[a])a=v[a]; 41 return a; 42 } 43 void Kruskal(MGraph g,int &sum,Road road[]) { 44 int E,N; 45 E=g.e; 46 N=g.n; 47 for(int i=0; i<N; i++)v[i]=i; 48 sort(road,E); 49 for(int i=0; i<E; i++) { 50 int a=getRoot(road[i].a); 51 int b=getRoot(road[i].b); 52 if(a!=b) { 53 v[a]=b; 54 sum+=road[i].w;//求生成树的权值,这句并不是本算法的固定写法,也可改成其他 55 } 56 } 57 }
越努力越幸运