图的邻接矩阵

来源:互联网 发布:淘宝联盟新增导购推广 编辑:程序博客网 时间:2024/05/18 01:23
#include<stdio.h>#include<stdlib.h>#define MAXVEX 100      //最大顶点数typedef char VertexType;     //顶点typedef int EdgeType;   //权值#define INFINITY 65535      /*用65535来代表∞*/#define UNVISITED -1    //标记未访问#define VISITED 1   //标记未访问typedef struct{    int from;   //边的始点    int to; //边的终点    EdgeType weight;    //权重}Edge;  //边的结构typedef struct{    int numVertex;  //顶点个数    int numEdge;    //边的个数    VertexType vexs[MAXVEX];    /*顶点表*/    int Indegree[MAXVEX];   //顶点入度    int Mark[MAXVEX];   //标记是否被访问过    EdgeType arc[MAXVEX][MAXVEX];   //边表}Graph;void InitGraph(Graph * G,int numVert,int numEd )    //传入顶点个数,边数{    G->numVertex=numVert;    G->numEdge=numEd;    for(int i=0;i<numVert;i++)    {        G->Mark[i]=UNVISITED;        G->Indegree[i]=0;        for(int j=0;j<numVert;j++)        {            G->arc[i][j]=INFINITY;            if(i==j)            {                G->arc[i][j]=0;            }        }    }    return ;}//判断是否为边bool IsEdge(Edge oneEdge){    if(oneEdge.weight>0 && oneEdge.weight!=INFINITY && oneEdge.to>=0)    {        return true;    }    else    {        return false;    }}//建立无向图的邻接矩阵void CreatUGraph(Graph * G){    int i,j,k,w;    printf("请输入%d个顶点元素:\n",G->numVertex);    for(i=0;i<G->numVertex;i++)    {        scanf(" %c",&G->vexs[i]);    }    for(k=0;k<G->numEdge;k++)    {        printf("请输入边(Vi,Vj)的下标Vi,Vj,和权重w:\n");        scanf("%d%d%d",&i,&j,&w);        G->Indegree[i]++;        G->Indegree[j]++;        G->arc[i][j]=w;        G->arc[j][i]=G->arc[i][j];    }}//建立有向图的邻接矩阵void CreatGraph(Graph * G){    int i,j,k,w;    printf("请输入%d个顶点元素:\n",G->numVertex);    for(i=0;i<G->numVertex;i++)    {        scanf(" %c",&G->vexs[i]);    }    for(k=0;k<G->numEdge;k++)    {        printf("请输入边(Vi,Vj)的下标Vi,Vj,和权重w:\n");        scanf("%d%d%d",&i,&j,&w);        G->Indegree[j]++;        G->arc[i][j]=w;    }}//返回顶点个数int VerticesNum(Graph * G){    return G->numVertex;}//返回依附于顶点的第一条边Edge FirstEdge(Graph * G,int oneVertex){    Edge firstEdge;    firstEdge.from=oneVertex;    for(int i=0;i<G->numVertex;i++)    {        if(G->arc[oneVertex][i]!=0 && G->arc[oneVertex][i]!=INFINITY)        {            firstEdge.to=i;            firstEdge.weight=G->arc[oneVertex][i];            break;        }    }    return firstEdge;}   //返回oneEdge的终点int ToVertex(Edge oneEdge){    return oneEdge.to;}//返回与preEdge有相同顶点的下一条边Edge NextEdge(Graph * G,Edge preEdge){    Edge myEdge;    myEdge.from=preEdge.from;   //边的始点与preEdge的始点相同    if(preEdge.to<G->numVertex) //如果preEdge.to+1>=G->numVertex;将不存在下一条边        for(int i=preEdge.to+1;i<G->numVertex;i++)  //找下一个arc[oneVertex][i]        {                                           //不为0的i            if(G->arc[preEdge.from][i]!=0 && G->arc[preEdge.from][i]!=INFINITY)            {                myEdge.to=i;                myEdge.weight=G->arc[preEdge.from][i];                break;            }        }        return myEdge;}//访问当前的顶点void Vist(Graph * G,int v){    printf("%c ",G->vexs[v]);}//图的深度优先周游(DFS)算法void DFS(Graph * G,int v){    G->Mark[v]=VISITED;    Vist(G,v);    for(Edge e=FirstEdge(G,v);IsEdge(e);e=NextEdge(G,e))    {        if(G->Mark[ToVertex(e)]==UNVISITED)        {            DFS(G,ToVertex(e));        }    }}int main(){    int numVert,numEd;    int v;    int choose;    Graph G;    int from,to,weight;    printf("请输入顶点个数和边数:\n");    scanf("%d%d",&numVert,&numEd);    InitGraph(&G,numVert,numEd);    printf("请选择图的类型:\n1.无向图\n2.有向图\n");    scanf("%d",&choose);    if(choose==1)    {        CreatUGraph(&G);    }    else if(choose==2)    {        CreatGraph(&G);    }    else    {        printf("选择错误!\n");        return 0;    }    printf("请选择以哪个顶点作为起始点遍历,请输入其下标:\n");    scanf("%d",&v);    DFS(&G,v);    return 0;}

这里写图片描述 这里写图片描述
这里写图片描述
这里写图片描述

0 0