带权图生产最小生成树
来源:互联网 发布:centos挂载硬盘 编辑:程序博客网 时间:2024/05/15 05:35
#include<stdio.h>
#define MAX_Q_SIZE 100
typedef struct edge{
int srcV;
int dstV;
int distance;
}Edge;
typedef struct priorityQ{
Edge queueArray[MAX_Q_SIZE];
int size;
}PriorityQ;
typedef struct ver{
char c;
bool isIntree;
}Ver;
typedef struct graph{
Ver verList[MAX_Q_SIZE];
int adjMat[MAX_Q_SIZE][MAX_Q_SIZE];
PriorityQ priorityQ;
int curVert;
int nVerts;
int nTree;
}Graph;
Graph g_Graph;
Edge tempE;
#define g_PriorityQ (g_Graph.priorityQ)
#define g_verList (g_Graph.verList)
/*优先级队列函数-----------start--------------*/
void insert(int sv,int dv,int d){
/*找到插入点*/
for(int i=0;i<g_PriorityQ.size;i++){
if(g_PriorityQ.queueArray[i].distance<=d){
break;
}
}
for(int j=g_PriorityQ.size-1;j>=i;j--){
g_PriorityQ.queueArray[j+1].srcV = g_PriorityQ.queueArray[j].srcV;
g_PriorityQ.queueArray[j+1].dstV = g_PriorityQ.queueArray[j].dstV;
g_PriorityQ.queueArray[j+1].distance = g_PriorityQ.queueArray[j].distance;
}
g_PriorityQ.queueArray[i].srcV = sv;
g_PriorityQ.queueArray[i].dstV = dv;
g_PriorityQ.queueArray[i].distance = d;
g_PriorityQ.size++;
//printf("i=%d,insert---- %d-%d-%d\n",i,sv,dv,d);
return;
}
void printPQ(){
for(int j=0;j<g_PriorityQ.size;j++){
printf("g_PriorityQ %d-%d-%d %d\n",
g_PriorityQ.queueArray[j].srcV,g_PriorityQ.queueArray[j].dstV,g_PriorityQ.queueArray[j].distance,j);
}
return;
}
Edge * removeMin(){
g_PriorityQ.size--;
tempE = g_PriorityQ.queueArray[g_PriorityQ.size];
//printf("removeMin %d-%d-%d %d\n",tempE.srcV,tempE.dstV,tempE.distance,g_PriorityQ.size);
return &tempE;
}
Edge * removeN(int n){
tempE = g_PriorityQ.queueArray[n];
for(int i =n;i<g_PriorityQ.size-1;i++){
g_PriorityQ.queueArray[i].srcV = g_PriorityQ.queueArray[i+1].srcV;
g_PriorityQ.queueArray[i].dstV = g_PriorityQ.queueArray[i+1].dstV;
g_PriorityQ.queueArray[i].distance = g_PriorityQ.queueArray[i+1].distance;
}
g_PriorityQ.size--;
return &tempE;
}
bool QisEmpty(){
return ((g_PriorityQ.size == 0)?true:false);
}
int peekMin(){
return g_PriorityQ.queueArray[g_PriorityQ.size-1].distance;
}
int peekN(int n){
return g_PriorityQ.queueArray[n].distance;
}
/*找到目的地址是d的节点*/
int find(int d){
for(int i=0;i<g_PriorityQ.size;i++){
if(g_PriorityQ.queueArray[i].dstV == d){
return i;
}
}
return -1;
}
/*优先级队列函数----------end---------------*/
/*带权图函数----------start---------------*/
void initGraph(){
for(int i=0;i<=MAX_Q_SIZE;i++){
for(int j=0;j<=MAX_Q_SIZE;j++){
g_Graph.adjMat[i][j] =10000;
}
}
g_Graph.nVerts =0;
g_Graph.nTree = 0;
g_PriorityQ.size =0;
}
void addVert(char c){
//printf("add --- %d-%c\n",g_Graph.nVerts,c);
g_Graph.verList[g_Graph.nVerts].c = c;
g_Graph.verList[g_Graph.nVerts].isIntree = false;
g_Graph.nVerts++;
}
void addEdge(int start,int end,int weight){
g_Graph.adjMat[start][end] = weight;
g_Graph.adjMat[end][start] = weight;
}
void putInPQ(int newVer,int newDistance){
/*查看是否存在有相同距离的边在*/
int index = find(newVer);
if(index == -1){/*如果不存在,直接插入*/
//printf("putInPQ %d-%d-%d\n",g_Graph.curVert,newVer,newDistance);
insert(g_Graph.curVert,newVer,newDistance);
}
else{
int d = peekN(index);
if(d>newDistance){
removeN(index);
//printf("putInPQ %d-%d-%d\n",g_Graph.curVert,newVer,newDistance);
insert(g_Graph.curVert,newVer,newDistance);
}
}
return;
}
void mstw(){
g_Graph.curVert = 0;/*从0开始*/
while(g_Graph.nTree < g_Graph.nVerts-1){/*不是所有的vert都在树里*/
/*将当前节点加到树里*/
//printf("cur-------------%c\n",g_Graph.verList[g_Graph.curVert].c);
g_Graph.verList[g_Graph.curVert].isIntree =true;
g_Graph.nTree++;
/*遍历所有的节点,把存在的边放到优先级队列里*/
for(int j=0;j<g_Graph.nVerts;j++){
if((j == g_Graph.curVert)
||(g_Graph.verList[j].isIntree)){
continue;
}
int ins = g_Graph.adjMat[g_Graph.curVert][j];
if(ins == 10000){
continue;
}
putInPQ(j,ins);
}
if(g_PriorityQ.size == 0){
printf("can not connected!\n");
return;
}
Edge *p = removeMin();
int sV = p->srcV;
g_Graph.curVert = p->dstV;
//printf("%d-%d-%d \n", p->srcV,p->dstV,p->distance);
printf("%c-%c \n",g_Graph.verList[sV].c,g_Graph.verList[p->dstV].c);
//g_PriorityQ.size = 0;
}
}
void main(){
initGraph();
addVert('A');
addVert('B');
addVert('C');
addVert('D');
addVert('E');
addVert('F');
addEdge(0,1,6);
addEdge(0,3,4);
addEdge(1,2,10);
addEdge(1,3,7);
addEdge(1,4,7);
addEdge(2,3,8);
addEdge(2,4,5);
addEdge(2,5,6);
addEdge(3,4,12);
addEdge(4,5,7);
mstw();
}
- 带权图生产最小生成树
- 带权图的最小生成树
- 带权图的最小生成树
- 最小比例 最小生成树
- 最小生成树&&次最小生成树
- 带权图的最小生成树问题
- 最小生成生成树计数
- 树+最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树Kruskal
- kruskal 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树问题
- iOS NSString的常用用法
- 到底错在哪里呢?
- Maven by example
- 第一道树形dp ural 1018
- canvas像素化video
- 带权图生产最小生成树
- 双色球
- opencv 中的错误error: ‘SurfFeatureDetector’ was not declared in this scope
- RBAC权限设计实例
- 数据库
- vc++6.0 调试详细教程
- Embedding Python with Boost.Python Part 1
- SVN无法提交-RA layer request failed的解决方法
- zoj-1016