带权图生产最小生成树

来源:互联网 发布: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();
}

 

原创粉丝点击