Prim与Kruskal算法

  1. Prime算法
View Code
 



#include <stdio.h>

#include <stdlib.h>

#define MAX 100

/********ÁÚ½Ó¾ØÕó½á¹¹***************/

typedef struct graph

{

 char vers[MAX];

 int numVertex,numEdge;

 int arc[MAX][MAX];

}Graph;



void CreateGraph(Graph *G)

{

 int i,j;

 G->numEdge=10;

 G->numVertex=8;

 G->vers[0]='B';

 G->vers[1]='I';

 G->vers[2]='U';

 G->vers[3]='Y';

 G->vers[4]='T';

 G->vers[5]='G';

 G->vers[6]='C';

 G->vers[7]='D';



 for (i=0; i<8; ++i)

 {

  for (j=0; j<8; ++j)

  {

   G->arc[i][j]=MAX;

  }

 }

 G->arc[1][2]=1;

 G->arc[1][4]=2;

 G->arc[1][5]=3;

 G->arc[2][5]=4;

 G->arc[2][7]=5;

 G->arc[0][2]=6;

 G->arc[0][5]=7;

 G->arc[3][4]=8;

 G->arc[3][5]=9;

 G->arc[4][6]=10;

 for (i=0; i<8; ++i)

 {

  for (j=0; j<8; ++j)

  {

   G->arc[j][i]=G->arc[i][j];

  }

 }

}



void PrintGraph(Graph *G)

{

 int i, j;

 for (i=0; i<8; ++i)

 {

  for (j=0; j<8; ++j)

  {

   printf("%d ",G->arc[i][j]);

  }

  printf("\n");

 }

}



void Prim(Graph *G)

{

 int min,k,i,j;

 int lowcost[8];

 int vers[8];

 for (i=0; i<G->numVertex; i++)

 {

  lowcost[i]=G->arc[0][i];

  vers[i]=0;

 }

    printf("%c\n", G->vers[0]);

 for (i=1; i<G->numVertex; ++i)

 {

  min=MAX;

  j=1;

  k=0;

  while(j<G->numVertex)

  {

   if (lowcost[j] && lowcost[j]<min)

   {

    min=lowcost[j];

    k=j;

   }

   j++;

  }

  printf("(%c, %c)\n", G->vers[vers[k]], G->vers[k]);

  //printf("%c\n", G->vers[k]);

  lowcost[k]=0;

  for(j=1; j<G->numVertex; j++)

  {

   if (lowcost[j] && G->arc[k][j] < lowcost[j])

   {

    lowcost[j]=G->arc[k][j];

    vers[j]=k;

   }

  }

 }



}



int main()

{

 Graph G;

 CreateGraph(&G);

 Prim(&G);

 return 0;

}


Kruskal算法

View Code
#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define MAX 100

/********邻接矩阵结构***************/

typedef struct graph

{

    char vers[MAX];

    int numVertex,numEdge;

    int arc[MAX][MAX];

}Graph;

/*******定义边******/

typedef struct

{

    int begin;

    int end;

    int weight;

}Edge;



void CreateGraph(Graph *G)

{

    int i,j;

    G->numEdge=10;

    G->numVertex=8;

    G->vers[0]='B';

    G->vers[1]='I';

    G->vers[2]='U';

    G->vers[3]='Y';

    G->vers[4]='T';

    G->vers[5]='G';

    G->vers[6]='C';

    G->vers[7]='D';



    for (i=0; i<8; ++i)

    {

        for (j=0; j<8; ++j)

        {

            if (i==j)

            {

                G->arc[i][j]=0;

            }

            else

            {

                G->arc[i][j]=MAX;

            }            

        }

    }

    G->arc[1][2]=1;

    G->arc[1][4]=2;

    G->arc[1][5]=3;

    G->arc[2][5]=4;

    G->arc[2][7]=5;

    G->arc[0][2]=6;

    G->arc[0][5]=7;

    G->arc[3][4]=8;

    G->arc[3][5]=9;

    G->arc[4][6]=10;

    for (i=0; i<8; ++i)

    {

        for (j=0; j<8; ++j)

        {

            G->arc[j][i]=G->arc[i][j];

        }

    }

}



void PrintGraph(Graph *G)

{

    int i, j;

    for (i=0; i<8; ++i)

    {

        for (j=0; j<8; ++j)

        {

            printf("%d ",G->arc[i][j]);

        }

        printf("\n");

    }

}



int Find(int *parent, int f)

{

    while ( parent[f] > 0)

    {

        f = parent[f];

    }

    return f;

}



void Kruskal(Graph *G)

{

    int i,j,k=0;

    Edge edge[MAX];

        int parent[MAX];

    for(i=0; i<G->numVertex; i++)

        {

            for (j=i+1; j<G->numVertex; j++)

            {

                edge[k].begin=i;

                edge[k].end=j;

                edge[k].weight=G->arc[i][j];

                k++;

            }

        }



        for (i=0; i<k; i++)

        {

            for (j=i+1; j<k; j++)

            {

                if (edge[i].weight > edge[j].weight)

                {

                    int temp;

                    temp = edge[i].begin;

                    edge[i].begin = edge[j].begin;

                    edge[j].begin = temp;

                    temp = edge[i].end;

                    edge[i].end = edge[j].end;

                    edge[j].end = temp;

                    temp = edge[i].weight;

                    edge[i].weight = edge[j].weight;

                    edge[j].weight = temp;

                }

            }

        }



        for (i=0; i<G->numVertex; i++)

        {

            parent[i]=0;

        }



        printf("打印最小生成树:\n");

        int n,m;

        for (i = 0; i < G->numEdge; i++)

        {

            /******判断遍历的边是存在环*****/

            n = Find(parent,edge[i].begin);

            m = Find(parent,edge[i].end);

            if (n != m) 

            {

                parent[n] = m;    

                printf("(%d, %d) %d\n", edge[i].begin, edge[i].end, edge[i].weight);

            }

        }

}





int main()

{

    Graph G;

    CreateGraph(&G);

    Kruskal(&G);

    return 0;

}

 

 Floyd算法

View Code
#include <stdio.h>    

#include <stdlib.h>

#define  MAX 100



typedef struct

{

    int vexs[MAX];

    int arc[MAX][MAX];

    int numVertex;

    int numEdge;

}Graph;



typedef int Path[MAX][MAX];//arc[i][j]从vi到vj的最短路径

typedef int Distance[MAX][MAX];



void CreateGraph(Graph *G)

{

    int i, j;

    G->numEdge=16;

    G->numVertex=9;

    for (i = 0; i < G->numVertex; i++)

    {

        G->vexs[i]=i;

    }



    for (i = 0; i < G->numVertex; i++)

    {

        for ( j = 0; j < G->numVertex; j++)

        {

            if (i==j)

                G->arc[i][j]=0;

            else

                G->arc[i][j] = G->arc[j][i] =MAX;

        }

    }

    G->arc[0][1]=1;

    G->arc[0][2]=5; 

    G->arc[1][2]=3; 

    G->arc[1][3]=7; 

    G->arc[1][4]=5; 

    G->arc[2][4]=1; 

    G->arc[2][5]=7; 

    G->arc[3][4]=2; 

    G->arc[3][6]=3; 

    G->arc[4][5]=3;

    G->arc[4][6]=6;

    G->arc[4][7]=9; 

    G->arc[5][7]=5; 

    G->arc[6][7]=2; 

    G->arc[6][8]=7;

    G->arc[7][8]=4;

    for(i = 0; i < G->numVertex; i++)

    {

        for(j = i; j < G->numVertex; j++)

        {

            G->arc[j][i] =G->arc[i][j];

        }

    }



}

  

void Floyd(Graph *G, Path *P, Distance *D)

{    

    int v,w,k;    

    for(v=0; v<G->numVertex; ++v)

    {        

        for(w=0; w<G->numVertex; ++w)  

        {

            (*D)[v][w]=G->arc[v][w];    

            (*P)[v][w]=w;

        }

    }

    for(k=0; k<G->numVertex; ++k)   

    {

        for(v=0; v<G->numVertex; ++v)  

        {        

            for(w=0; w<G->numVertex; ++w)    

            {

                if ((*D)[v][w]>(*D)[v][k]+(*D)[k][w])

                {

                    (*D)[v][w]=(*D)[v][k]+(*D)[k][w];

                    (*P)[v][w]=(*P)[v][k];

                }

            }

        }

    }

}



int main(void)

{    

    int v,w,k;  

    Graph G;        

    Path P;    

    Distance D;    

    CreateGraph(&G);

    Floyd(&G,&P,&D);  

    printf("各顶点间最短路径如下:\n");    

    for(v=0; v<G.numVertex; ++v)   

    {        

        for(w=v+1; w<G.numVertex; w++)  

        {

            printf("v%d-v%d weight: %d ",v,w,D[v][w]);

            k=P[v][w];

            printf(" path: %d",v);    

            while(k!=w)    

            {

                printf("--->%d",k);    

                k=P[k][w];

            }

            printf("--->%d\n",w);    

        }

        printf("\n");

    }

    printf("最短距离D\n");

    for(v=0; v<G.numVertex; ++v)  

    {        

        for(w=0; w<G.numVertex; ++w)    

        {

            printf("%d\t",D[v][w]);

        }

        printf("\n");

    }

    printf("最短路径P\n");

    for(v=0; v<G.numVertex; ++v)  

    {        

        for(w=0; w<G.numVertex; ++w)    

        {

            printf("%d ",P[v][w]);

        }

        printf("\n");

    }

    return 0;

}

 

拓扑排序

View Code
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define  MAX 100

typedef struct graph

{

int vers[MAX];

int numVertex;

int numEdge;

int arc[MAX][MAX];

}Grpah;



typedef struct edgenode

{

int nodevalue;

int weight;

struct edgenode* next;

}Edgenode;



typedef struct adjlist

{

int in;  //表示节点的度

int data;

Edgenode* firstnode;

}Adjlist[MAX];



typedef struct

{

Adjlist adjlist;

int numVertex;

int numEdge;

}GraphList;



void CreateGraph(Grpah *G)

{

int i,j;

G->numEdge=20;

G->numVertex=14;

for (i = 0; i < G->numVertex; i++)

{

G->vers[i]=i;

}



for (i = 0; i < G->numVertex; i++)

{

for ( j = 0; j < G->numVertex; j++)

{

G->arc[i][j]=0;

}

} 

G->arc[0][4]=1;

G->arc[0][5]=1; 

G->arc[0][11]=1; 

G->arc[1][2]=1; 

G->arc[1][4]=1; 

G->arc[1][8]=1; 

G->arc[2][5]=1; 

G->arc[2][6]=1;

G->arc[2][9]=1;

G->arc[3][2]=1; 

G->arc[3][13]=1;

G->arc[4][7]=1;

G->arc[5][8]=1;

G->arc[5][12]=1; 

G->arc[6][5]=1; 

G->arc[8][7]=1;

G->arc[9][10]=1;

G->arc[9][11]=1;

G->arc[10][13]=1;

G->arc[12][9]=1;



}



void CreateGraphList(Grpah *G, GraphList *GL)

{

int i,j;

Edgenode *e;

GL->numEdge=G->numEdge;

GL->numVertex=G->numVertex;

for (i=0; i<GL->numVertex; ++i)

{

GL->adjlist[i].firstnode=NULL;

GL->adjlist[i].in=0;

GL->adjlist[i].data=G->vers[i];

}

for (i=0; i<GL->numVertex; ++i)

{

for (j=0; j<GL->numVertex; ++j)

{

if (G->arc[i][j]==1)

{

e=(Edgenode* )malloc(sizeof(Edgenode));

e->nodevalue=j;

e->weight=G->arc[i][j];

e->next=GL->adjlist[i].firstnode;

GL->adjlist[i].firstnode=e;

GL->adjlist[j].in++;

}

}

}

}



void PrintGraph(Grpah *G)

{

int i,j;

for (i=0; i<G->numVertex; i++)

{

for (j=0; j<G->numVertex; ++j)

{

printf("%d ",G->arc[i][j]);

}

printf("\n");

}

}



void PrintGraphList(GraphList *GL)

{

int i;

Edgenode *p;

for (i=0; i<GL->numVertex; ++i)

{

p=GL->adjlist[i].firstnode;

printf("%d", GL->adjlist[i].data);

while(p)

{

printf("<--->%d", p->nodevalue);

p=p->next;

}

printf("\n");

}

};



void TopSort(GraphList *GL)

{

    Edgenode *e;    

    int i,k,gettop;   

    int top=0;  

    int *stack;   

    stack=(int *)malloc(GL->numVertex * sizeof(int));     

    for(i = 0; i<GL->numVertex; i++)   

    {

        if(0 == GL->adjlist[i].in) 

        {

            stack[++top]=i;  

        }

    }   

    while(top!=0)    

    {        

        gettop=stack[top--];        

        printf("%d<--->",GL->adjlist[gettop].data);              

        for(e = GL->adjlist[gettop].firstnode; e; e = e->next)        

        {            

            k=e->nodevalue;            

            if(!(--GL->adjlist[k].in))

            {

                stack[++top]=k;        

            }

        } 

    }

}



int main()

{

    Grpah G;

    GraphList GL;

    CreateGraph(&G);

    PrintGraph(&G);

    CreateGraphList(&G,&GL);

    PrintGraphList(&GL);

    TopSort(&GL);

    return 0;

}

最佳路径

View Code
#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#define  MAX 100

int *etv;  //事件最早发生时间

int *ltv; //事件最迟发生时间

int *stack2;

int top2=0;



typedef struct graph

{

int vers[MAX];

int numVertex;

int numEdge;

int arc[MAX][MAX];

}Grpah;



typedef struct edgenode

{

int nodevalue;

int weight;

struct edgenode* next;

}Edgenode;



typedef struct adjlist

{

int in;  //表示节点的度

int data;

Edgenode* firstnode;

}Adjlist[MAX];



typedef struct

{

Adjlist adjlist;

int numVertex;

int numEdge;

}GraphList;



void CreateGraph(Grpah *G)

{

int i,j;

G->numEdge=13;

G->numVertex=10;

for (i = 0; i < G->numVertex; i++)

{

G->vers[i]=i;

}



for (i = 0; i < G->numVertex; i++)

{

for ( j = 0; j < G->numVertex; j++)

{

G->arc[i][j]=0;

}

} 

G->arc[0][1]=3;

G->arc[0][2]=4;

G->arc[1][3]=5;

G->arc[1][4]=6;

G->arc[2][3]=8;

G->arc[2][5]=7;

G->arc[3][4]=3;

G->arc[4][6]=9;

G->arc[4][7]=4;

G->arc[5][7]=6;

G->arc[6][9]=2;

G->arc[7][8]=5;

G->arc[8][9]=3;



}



void CreateGraphList(Grpah *G, GraphList *GL)

{

int i,j;

Edgenode *e;

GL->numEdge=G->numEdge;

GL->numVertex=G->numVertex;

for (i=0; i<GL->numVertex; ++i)

{

GL->adjlist[i].firstnode=NULL;

GL->adjlist[i].in=0;

GL->adjlist[i].data=G->vers[i];

}

for (i=0; i<GL->numVertex; ++i)

{

for (j=0; j<GL->numVertex; ++j)

{

if (G->arc[i][j])

{

e=(Edgenode* )malloc(sizeof(Edgenode));

e->nodevalue=j;

e->weight=G->arc[i][j];

e->next=GL->adjlist[i].firstnode;

GL->adjlist[i].firstnode=e;

GL->adjlist[j].in++;

}

}

}

}



void PrintGraph(Grpah *G)

{

int i,j;

for (i=0; i<G->numVertex; i++)

{

for (j=0; j<G->numVertex; ++j)

{

printf("%d ",G->arc[i][j]);

}

printf("\n");

}

}



void PrintGraphList(GraphList *GL)

{

int i;

Edgenode *p;

for (i=0; i<GL->numVertex; ++i)

{

p=GL->adjlist[i].firstnode;

printf("%d", GL->adjlist[i].data);

while(p)

{

printf("<--->%d", p->nodevalue);

p=p->next;

}

printf("\n");

}

};



void TopSort(GraphList *GL)

{

Edgenode *e;    

int i,k,gettop;   

int top=0; 

int *stack;   

stack=(int *)malloc(GL->numVertex * sizeof(int));  

stack2=(int *)malloc(GL->numVertex * sizeof(int)); 

etv=(int* )malloc(GL->numVertex*sizeof(int));

for (i=0; i<GL->numVertex; i++)

{

etv[i]=0;

}

for(i = 0; i<GL->numVertex; i++)   

{

if(0 == GL->adjlist[i].in) 

{

stack[++top]=i;  

}

} 

printf("拓扑排序:\n");

while(top!=0)    

{        

gettop=stack[top--];      

stack2[++top2]=gettop;

printf("%d<--->",GL->adjlist[gettop].data);              

for(e = GL->adjlist[gettop].firstnode; e; e = e->next)        

{            

k=e->nodevalue;            

if(!(--GL->adjlist[k].in))

{

stack[++top]=k;        

}

if (etv[gettop]+e->weight > etv[k])

{

etv[k]=etv[gettop]+e->weight;

}

} 

}

printf("\n");

}



void CriticalPath(GraphList *GL)

{

Edgenode *p;

int i,j,k;

TopSort(GL);

ltv=(int *)malloc(sizeof(int)*GL->numVertex);

for (i=0; i<GL->numVertex; i++)

{

ltv[i]=etv[GL->numVertex-1];

}

printf("事件最早发生时间:\n");

for (i=0; i<GL->numVertex; ++i)

{

printf("%d<--->",etv[i]);

}

printf("\n");

while(top2)

{

int gettop=stack2[top2--];

p=GL->adjlist[gettop].firstnode;

while(p)

{

k=p->nodevalue;

if (ltv[k]-p->weight<ltv[gettop])

{

ltv[gettop]=ltv[k]-p->weight;

}

p=p->next;

}

}

printf("事件最迟发生时间:\n");

for (i=0; i<GL->numVertex; ++i)

{

printf("%d<--->",ltv[i]);

}

printf("\n");



int e,l;

for(i=0; i<GL->numVertex; i++)      

{            

for(p = GL->adjlist[i].firstnode; p; p = p->next)            

{                

k=p->nodevalue;                

e= etv[i];                 

l= ltv[k]-p->weight;                

if(e == l)                   

printf("v%d <---> v%d length: %d \n",GL->adjlist[i].data,GL->adjlist[k].data, p->weight);

}        

}

}



int main()

{

Grpah G;

GraphList GL;

CreateGraph(&G);

PrintGraph(&G);

CreateGraphList(&G,&GL);

PrintGraphList(&GL);

CriticalPath(&GL);

return 0;

}

 

 

 

你可能感兴趣的:(Prim)