图的基本操作和应用

这段代码展示了如何将图从矩阵表示转换为邻接表,并实现了Floyd、Prim和Dijkstra算法。它首先创建了一个无向加权图(UDG)和有向图(DG),然后显示了图的矩阵表示,接着将其转换为邻接表并显示。最后,通过Floyd算法计算最短路径,并用Dijkstra算法从不同起点找到最短路径。
摘要由CSDN通过智能技术生成

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define MAXV 20
#define INF 65535

typedef struct MatGraph
{
    int edge[MAXV][MAXV];
    int n,e;
    int vex[MAXV];
}MGraph;
typedef struct Arcnode
{
    int adjvex;
    struct Arcnode *nextarc;
    int weight;
}ArcNode;
typedef struct VexNode
{
    int data;
    int indgree;
    ArcNode *firstarc;
}VNode;
typedef struct AdjGraph
{
    int n,e;
    VNode adjlist[MAXV];
}AGraph;
create_mg_fromMatrix(MGraph *&mg,int a[][MAXV],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];

}
show_mg(MGraph *mg)
{
    int i,j;
    printf("the mat Graph is :\n");
    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");
    }
}
int mat_to_adj(MGraph *mg, AGraph *&ag)
{
    int i,j;
    ArcNode *p;
    ag=(AGraph *)malloc(sizeof(AGraph));
    ag->n=mg->n;
    for(i=0;i<ag->n;i++)
        ag->adjlist[i].firstarc=NULL;
    for(i=0;i<mg->n;i++)
    {
        for(j=0;j<mg->n;j++)
            if(mg->edge[i][j]!=0&&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 show_adj(AGraph *ag)
{
    int i;
    ArcNode *p;
    printf("Adj  Graph is :\n");
    for(i=0;i<ag->n;i++)
    {
        p=ag->adjlist[i].firstarc;
        printf("%d : ",i);
        while(p!=NULL)
        {
            printf("-- %d %3d ",p->adjvex,p->weight);
            p=p->nextarc;
        }
        printf("\n");
    }

}
adj_to_mat(AGraph *ag,MGraph *&newmg)
{
    int i,j;ArcNode *p;
    newmg=(MGraph *)malloc(sizeof(MGraph));
    newmg->n=ag->n;
    for(i=0;i<ag->n;i++)
        for(j=0;j<ag->n;j++)
             if(i==j)
                newmg->edge[i][j]=0;
             else
                newmg->edge[i][j]=INF;
   for(i=0;i<ag->n;i++)
   {
       p=ag->adjlist[i].firstarc;
       while(p!=NULL)
       {
           newmg->edge[i][p->adjvex]=p->weight;
           p=p->nextarc;
       }
   }
}
int compute_degree_mg(MGraph *mg)
{
    int i,j,degree;
    for(i=0;i<mg->n;i++)
    {
        printf("%d dgree is : ",i);
        degree=0;
        for(j=0;j<mg->n;j++)
            if(mg->edge[i][j]!=0&&mg->edge[i][j]!=INF)
                  degree++;
        printf(" %d\n",degree);
    }
}
int compute_degree_ag(AGraph *ag)
{
    int i,degree;
    ArcNode *p;
    for(i=0;i<ag->n;i++)
    {
         printf("%d dgree is : ",i);
         degree=0;
         p=ag->adjlist[i].firstarc;
         while(p!=NULL)
         {
             degree++;p=p->nextarc;
         }
         printf(" %d\n",degree);
    }
}
int visited[MAXV];
int dfs(AGraph *ag,int v)
{   ArcNode *p;int m;
    visited[v]=1;
    printf("-%d ",v);
    p=ag->adjlist[v].firstarc;
    while(p!=NULL)
    {
        m=p->adjvex;
        if(visited[m]==0)
            dfs(ag,m);
        p=p->nextarc;
    }
}
int dfs_traverse(AGraph *ag)
{
    int i;
    for(i=0;i<ag->n;i++)
        visited[i]=0;
    printf("\n dfs Graph : ");
    for(i=0;i<ag->n;i++)
        if(visited[i]==0)
             dfs(ag,i);
}
int bfs_traverse(AGraph *ag,int v)
{
    int Qu[MAXV];int f,r,i,m,k;ArcNode *p;
    f=0,r=0;
    for(i=0;i<ag->n;i++)
        visited[i]=0;
    visited[v]=1;
    printf("\n bfs Graph: -%d ",v);
    r++;Qu[r]=v;
    while(f!=r)
    {
        f++;m=Qu[f];
        p=ag->adjlist[m].firstarc;
        while(p!=NULL)
        {   k=p->adjvex;
            if(visited[k]==0)
            {
            visited[k]=1;
            printf("-%d ",k);
            r++;Qu[r]=k;
            }

            p=p->nextarc;
        }
    }

}
prim(MGraph *mg,int v)
{
    int lowcost[MAXV],adjvex[MAXV];
    int i,j,minvalue,k;
    for(i=0;i<mg->n;i++)
    {
        lowcost[i]=mg->edge[v][i];
        adjvex[i]=v;
    }
    lowcost[v]=0;
    for(i=0;i<mg->n-1;i++)
    {
       minvalue=INF;
       for(j=0;j<mg->n;j++)
       {
           if(lowcost[j]!=0&&lowcost[j]<minvalue)
           {
               k=j;minvalue=lowcost[j];
           }
       }
       lowcost[k]=0;
       printf("%d - %d  weight %d \n",adjvex[k],k,mg->edge[adjvex[k]][k]);
       for(j=0;j<mg->n;j++)
       {
           if(j!=k&&lowcost[j]!=0&&mg->edge[k][j]<lowcost[j])
           {
               lowcost[j]=mg->edge[k][j];
               adjvex[j]=k;
           }
       }
    }
}
int dijkstra(MGraph *mg,int v)
{
    int path[MAXV],finished[MAXV],dist[MAXV];
    int i,minvalue,k,j;
    for(i=0;i<mg->n;i++)
    {
        path[i]=v;dist[i]=mg->edge[v][i];finished[i]=0;
    }
    finished[v]=1;
    printf("Dijkstra : %d \n",v);
    for(i=0;i<mg->n-1;i++)
    {
        minvalue=INF;
        for(j=0;j<mg->n;j++)
           if(finished[j]!=1 && dist[j]<minvalue)
            {
               k=j;minvalue=dist[j];
            }
         finished[k]=1;
         printf(" %d min dist %d  path %d \n",k,dist[k],path[k]) ;
       for(j=0;j<mg->n;j++)
            if(finished[j]!=1&& dist[k]+mg->edge[k][j] <dist[j])
             {
                   dist[j]= dist[k]+mg->edge[k][j];path[j]=k;
               }
    }
}
int floyd(MGraph *mg)
{
    int i,j,k;
    int a[MAXV][MAXV];
    int path[MAXV][MAXV];
    for(i=0;i<mg->n;i++)
        for(j=0;j<mg->n;j++)
           a[i][j]=mg->edge[i][j];
    for(k=0;k<mg->n;k++)
        for(i=0;i<mg->n;i++)
           for(j=0;j<mg->n;j++)
              if(a[i][k]+a[k][j]<a[i][j])
                   a[i][j]=a[i][k]+a[k][j];
    printf(" flody matrix :\n");
     for(i=0;i<mg->n;i++)
     {
          for(j=0;j<mg->n;j++)
            if(a[i][j]==65535)
               printf("INF ");
            else
             printf("%3d ",a[i][j]);
          printf("\n") ;
     }

}
int main()
{
    int a[MAXV][MAXV]={  //UDG
        {0,28,INF,INF,INF,10,INF},
        {28,0,16,INF,INF,INF,14},
        {INF,16,0,12,INF,INF,INF},
        {INF,INF,12,0,22,INF,18},
        {INF,INF,INF,22,0,25,24},
        {10,INF,INF,INF,25,0,INF},
        {INF,14,INF,18,24,INF,0}};
    int b[MAXV][MAXV]={  //DG
        {0,  5,INF,7},
        {INF,0,  4,2},
        {3,  3,  0,2},
        {INF,INF,1,0}};
    int i,j,n;
    MGraph *mg,*newmg;AGraph *ag;
    n=4;
    create_mg_fromMatrix(mg,b,n);
    show_mg(mg);
    mat_to_adj(mg,ag);
    show_adj(ag);
    floyd(mg);
    for(i=0;i<4;i++)
        dijkstra(mg,i);

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值