无向图的基本操作 含prim

#include "stdio.h"
#include "stdlib.h"
#define Maxsize 30
#define INF 65535
int visited[Maxsize];
typedef struct MGraph
{
    int vex[Maxsize];
    int edge[Maxsize][Maxsize];
    int n;
    int e;
}mgraph;
typedef struct ArcNode
{
    int weight;
    int adjvex;
    struct ArcNode *nextarc;
}arcnode;
typedef struct VexNode
{
    int data;
    struct ArcNode *firstarc;
}vexnode;
typedef struct AdjGraph
{
    int n;
    int e;
    vexnode adjlist[Maxsize];
}agraph;
int showMatGraph(MGraph *mg)
{
    int i,j;
    for(i=0;i<mg->n;i++)
    {
        for(j=0;j<mg->n;j++)
            if(mg->edge[i][j]==INF)
               printf("INF ");
            else
               printf("%3d ",mg->edge[i][j]);
        printf("\n");
    }
    return 1;
}
 int createMatGraph(mgraph *&mg,int a[][6],int n)
 {
     int i,j;
     mg=(mgraph *)malloc(sizeof(mgraph));
     mg->n=n;
     for(i=0;i<n;i++)
        for(j=0;j<n;j++)
           mg->edge[i][j]=a[i][j];
     return 1;
 }
int matToLinkGraph(mgraph *mg,agraph *&ag)
{
    int i,j;
    arcnode *p;
    ag=(agraph*)malloc(sizeof(agraph));
    ag->n=mg->n;
    for(i=0;i<mg->n;i++)
    {
        ag->adjlist[i].firstarc=NULL;
        for(j=0;j<mg->n;j++)
        {
            if(mg->edge[i][j]!=INF)
              {
                  p=(arcnode *)malloc(sizeof(arcnode));
                  p->weight=mg->edge[i][j];
                  p->adjvex=j;
                  p->nextarc=ag->adjlist[i].firstarc;
                  ag->adjlist[i].firstarc=p;
              }
        }
    }
}
int showAdjGraph(agraph *ag)
{
    arcnode *p;
    int i;
    for(i=0;i<ag->n;i++)
    {   printf("%d :",i);
        p=ag->adjlist[i].firstarc;
        while(p!=NULL)
        {
            printf("%3d(%d)-> ",p->weight,p->adjvex);
            p=p->nextarc;
        }
        printf("\n");
    }
}
int showDegreeMg(mgraph *mg)
{
    int degree[Maxsize];
    int i,j;
    for(i=0;i<mg->n;i++)
    {   degree[i]=0;
        for(j=0;j<mg->n;j++)
            if(mg->edge[i][j]!=INF)
               degree[i]++;
    }
    for(i=0;i<mg->n;i++)
        printf("%d ",degree[i]);
    printf("\n");
}
int showDegreeAg(agraph *ag)
{
    int i;arcnode *p;
    int degree[Maxsize];
    for(i=0;i<ag->n;i++)
    {
        degree[i]=0;
        p=ag->adjlist[i].firstarc;
        while(p!=NULL)
        {
            degree[i]++;
            p=p->nextarc;
        }
    }
   for(i=0;i<ag->n;i++)
        printf("%d ",degree[i]);
    printf("\n");
}
typedef struct CloseEdge
{
    int lowcost;
    int adjvex;
}closeEdge;
int showClosedge( closeEdge a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d ",a[i].adjvex);
    printf("\n");
    for(i=0;i<n;i++)
        printf("%d ",a[i].lowcost);
    printf("\n");  printf("\n");
}

int prim_MST(mgraph *mg,int v0)
{
   int i,j;
   int k,kmin;
   closeEdge closedge[Maxsize];
   for(i=0;i<mg->n;i++)
   {  closedge[i].adjvex=v0;
      closedge[i].lowcost=mg->edge[v0][i];
   }
   closedge[v0].lowcost =0;
   showClosedge(closedge,mg->n);
   for(i=0;i<mg->n -1;i++)
   {  kmin=INF;
      for(j=0;j<mg->n;j++)
       if(closedge[j].lowcost!=0 && closedge[j].lowcost!=INF && closedge[j].lowcost < kmin)
       {
           k=j;kmin=closedge[j].lowcost;
       }
      closedge[k].lowcost=0;
       printf("the choosed is %d and %d value %d\n",k,closedge[k].adjvex,kmin);
       for(j=0;j<mg->n;j++)
       {
           if(closedge[j].lowcost!=0 &&  closedge[j].lowcost>mg->edge[k][j])
           {
               closedge[j].lowcost = mg->edge[k][j];
               closedge[j].adjvex = k;
           }
       }
         showClosedge(closedge,mg->n);
   }

}
int dfs(agraph *ag,int v)
{
    arcnode *p;
    visited[v]=1;
    printf("%d ->",v);
    p=ag->adjlist[v].firstarc;
    while(p!=NULL)
    {
        if(visited[p->adjvex]==0)
            dfs(ag,p->adjvex);
        p=p->nextarc;
    }
}
int dfs_traverse(agraph *ag)
{
    int i;
    for(i=0;i<ag->n;i++)
        visited[i]=0;
    printf("dfs traverse: ");
    for(i=0;i<ag->n;i++)
        if(visited[i]==0)
           dfs(ag,i);
}
int bfs_traverse(agraph *ag,int v)
{
    int myqueue[Maxsize];int front,rear;
    int i,w;
    arcnode *p;
    front=0;rear=0;
    for(i=0;i<ag->n;i++)
        visited[i]=0;
    visited[v]=1;
    printf("\nbst traverse: %d ->",v);
    myqueue[rear++]=v;
    while(front!=rear)
    {
        w=myqueue[front++];
        p=ag->adjlist[w].firstarc;
        while(p!=NULL)
        {
            if(visited[p->adjvex]==0)
            {
                visited[p->adjvex]=1;
                printf("%d-> ",p->adjvex);
                myqueue[rear++]=p->adjvex;
            }
            p=p->nextarc;
        }
    }
}

int dfs_path(agraph *ag,int v0,int v1,int path[],int k,int l)
{
    arcnode *p;int t;
    visited[v0]=1;
    path[k]=v0;
    k++;
    if(v0==v1&&k==l)
    {   for(int i=0;i<k;i++)
             printf("%d->",path[i]);
        printf("\n");

    }
    p=ag->adjlist[v0].firstarc;
    while(p!=NULL)
    {
        if(visited[p->adjvex]==0)
            t=dfs_path(ag,p->adjvex,v1,path,k,l);
            p=p->nextarc;
    }
    visited[v0]=0;
    k--;

}
// check i and j path,and output
int checkPath(agraph *ag,int v0,int v1)
{
    int path[Maxsize];
    int i,k;
    for(i=0;i<ag->n;i++)
        visited[i]=0;
    printf("\nfind %d to %d path: ",v0,v1);
    //for(i=0;i<ag->n;i++)
     //   if(visited[i]==0)
           k=dfs_path(ag,v0,v1,path,0,5);
    }

int main()
{
   //图7.16存储结构
   int a[6][6]={{INF,6,1,5,INF,INF},{6,INF,5,INF,3,INF},{1,5,INF,5,6,4},{5,INF,5,INF,INF,2},{INF,3,6,INF,INF,6},{INF,INF,4,2,6,INF}};
   int n=6;
   mgraph *mg;
   agraph *ag;
   createMatGraph(mg,a,n);
   showMatGraph(mg);
   matToLinkGraph(mg,ag);
   showAdjGraph(ag);
   showDegreeMg(mg);
   showDegreeAg(ag);
   prim_MST(mg,0);
   dfs_traverse(ag);
   bfs_traverse(ag,0);
   return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值