数据结构试验四 --图论

来源:互联网 发布:node v6.11.1 x64.msi 编辑:程序博客网 时间:2024/05/17 03:55

邻接表头文件

/*********************************************//*    邻接表存储结构   文件名:ljb.h      *//*********************************************/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define M 200typedef char DataType;typedef struct node{    int adjvex;/*邻接点*/    struct node *next;}EdgeNode;/*头结点类型*/typedef struct vnode{    DataType vertex;    EdgeNode *FirstEdge; /*邻接链表头指针*/}VertexNode;/*邻接表类型*/typedef struct{    VertexNode adjlist[M];  /*存放头结点的顺序表*/    int n,e;                /*顶点数与边数*/}LinkedGraph;/*函数功能:建立图的邻接表函数参数:邻接表指针变量g;文件名filename;参数c,c=0无向图,c=1有向图*/void creat(LinkedGraph *g,char *filename,int c){    int i,j,k;    EdgeNode *s;    FILE *fp;    fp=fopen(filename,"r");    if(fp){        fscanf(fp,"%d%d",&g->n,&g->e);            /*读入顶点数与边数*/        for(i=0;i<g->n;i++){            fscanf(fp,"%1s",&g->adjlist[i].vertex);/*读入顶点信息*/            g->adjlist[i].FirstEdge=NULL;         /*边表置为空表*/        }        for(k=0;k<g->e;k++){ /*循环e次建立边表*/            fscanf(fp,"%d%d",&i,&j);            s=(EdgeNode*)malloc(sizeof(EdgeNode));            s->adjvex=j;                         /*邻接点序号为j*/            s->next=g->adjlist[i].FirstEdge;            g->adjlist[i].FirstEdge=s;           /*将新结点*s插入顶点vi的边表头部*/            if(c==0){/*无向图*/                s=(EdgeNode*)malloc(sizeof(EdgeNode));                s->adjvex=i;                s->next=g->adjlist[j].FirstEdge;                g->adjlist[j].FirstEdge=s;            }        }        fclose(fp);    }    else        g->n=0;}void print(LinkedGraph g){    EdgeNode *p;    for(int i=0;i<g.n;i++){        printf("%c",g.adjlist[i].vertex);        p=g.adjlist[i].FirstEdge;        while(p)        {            printf("-->%d",p->adjvex);            p=p->next;        }        puts("");    }}



邻接矩阵头文件

/********************************************//*         邻接矩阵类型定义的头文件         *//*               文件名:ljjz.h             *//********************************************/#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define INF 0x3f3f3f3f#define M 200typedef char vertextype;typedef int edgetype;typedef struct{    int n,e;  /*顶点数与边数*/    vertextype vexs[M];    edgetype edges[M][M];}Mgraph;/*函数参数:邻接矩阵的指针变量g;存放图信息的文件名s;*/void creat(Mgraph *g,char *s,int c)//c=0无向图,c=1有向图{    int i,j,k,w;    FILE *rf;    rf=fopen(s,"r");    if(rf){        fscanf(rf,"%d%d",&g->n,&g->e);        for(i=0;i<g->n;i++)            fscanf(rf,"%1s",&g->vexs[i]);        for(i=0;i<g->n;i++)//初始化            for(j=0;j<g->n;j++)                if(i==j)                    g->edges[i][j]=0;                else                    g->edges[i][j]=INF;        for(k=0;k<g->e;k++){ /*读入网络中的边*/            fscanf(rf,"%d%d%d",&i,&j,&w);            g->edges[i][j]=w;            if(c==0)                g->edges[j][i]=w;        }        fclose(rf);    }    else        g->n=0;}void print(Mgraph g){    for(int i=0;i<g.n;i++)        printf("%c",g.vexs[i]);    puts("");    printf("     0");    for(int i=0;i<g.n;i++)        printf("%6d",i);    puts("");    for(int i=0;i<g.n;i++){        printf("%6d",i);        for(int j=0;j<g.n;j++){            if(g.edges[i][j]!=INF)                printf("%6d",g.edges[i][j]);            else                printf("    **");        }        puts("");    }}


求无向图各顶点的度

/*编写程序输出以邻接表为存储结构的无向图的各顶点的度*//**********************************//*文件名称:lab8_01.cpp           *//**********************************/#include"ljb.h"void degree(LinkedGraph g){    for(int i=0;i<g.n;i++){        EdgeNode *temp=g.adjlist[i].FirstEdge;        int cnt=0;        while(temp)        {            cnt++;            temp=temp->next;        }        printf("顶点%d的度为%d\n",i,cnt);    }}int main(){    LinkedGraph g;    creat(&g,"g11.txt",0);    printf("\n The graph is:\n");    print(g);    degree(g);    return 0;}


广度优先遍历:

思想:对第一条路径进行遍历的同时,找到从条路径上每个点作为头结点的路径

/*图采用邻接表存储结构,对图进行广度优先遍历*//**********************************//*文件名称:lab8_02.c             *//**********************************/#include"ljb.h"#include<queue>#include<string.h>using namespace std;int visit[300];void bfs(LinkedGraph g,int i){    queue<EdgeNode *>que;    while(!que.empty())        que.pop();    visit[g.adjlist[i].vertex-'0']=1;    printf("%c ",g.adjlist[i].vertex);    EdgeNode *temp=g.adjlist[i].FirstEdge;    que.push(temp);    while(!que.empty())    {        EdgeNode *t=que.front();        que.pop();        while(t){            for(int k=i+1;k<g.n;k++){                int ch=g.adjlist[k].vertex-'0';                if(visit[ch]==0&&(ch==t->adjvex)){                    que.push(g.adjlist[k].FirstEdge);                    visit[ch]=1;                    printf("%d ",ch);                }            }            t=t->next;        }    }}int BfsTraverse(LinkedGraph g){    int cnt=0;    memset(visit,0,sizeof(visit));    for(int i=0;i<g.n;i++){        if(!visit[i]){            puts("");            cnt++;            /*连通分量个数加1*/            bfs(g,i);        }    }    return cnt;}int main(){    LinkedGraph g;    int cnt;    creat(&g,"g11.txt",0);    printf("\n The graph is:\n");    print(g);    printf("广度优先遍历序列为:\n");    cnt=BfsTraverse(g);    printf("\n该图共有%d个连通分量。\n",cnt);    return 0;}


DFS(递归下去就可以了)

/*    图采用邻接表存储结构,编程对图进行深度优先遍历。*/#include"ljb.h"#include<string.h>int visited[M];void dfs(LinkedGraph g,int i){    /*从顶点i开始深度优先遍历图的连通分量*/    EdgeNode *p;    printf("visit vertex: %c \n",g.adjlist[i].vertex);/*访问顶点i*/    visited[i]=1;    p=g.adjlist[i].FirstEdge;    while(p&&visited[p->adjvex]==0)                 /*从p的邻接点出发进行深度优先搜索*/    {        printf("visit vertex: %d \n",p->adjvex);        visited[p->adjvex]=1;        dfs(g,p->next->adjvex);    }}void DfsTraverse(LinkedGraph g){    memset(visited,0,sizeof(visited));    for(int i=0;i<g.n;i++)        if(!visited[i])            dfs(g,i);}int main(){    LinkedGraph g;    creat(&g,"g11.txt",0);  /*创建图的邻接表*/    printf("\n The graph is:\n");    print(g);    printf("深度优先遍历序列为:\n");    DfsTraverse(g);    /*从顶点0开始深度优先遍历图无向图g*/}


最小生成树prim

/*********************************************//*           Prim求解最小生成树算法          *//*********************************************/#include"ljjz.h"#include<string.h>#define MAXN 0x3f3f3ftypedef struct edgedata  /*用于保存最小生成树的边类型定义*/{    int beg,en;     /*beg,en是边顶点序号*/    int length;     /*边长*/}edge;void prim(Mgraph g){    edge tree[M],temp;    int tot=0;    int weight[M],pos=0;    int min_weight,p;    int last[M];    memset(weight,MAXN,sizeof(weight));    memset(last,0,sizeof(last));    for(int i=0;i<g.n-1;i++){        weight[pos]=-1;        min_weight=MAXN;        for(int j=0;j<g.n;j++){            if(weight[j]>=0){                if(weight[j]>g.edges[pos][j]){                    last[j]=pos;                    weight[j]=g.edges[pos][j];                }                if(weight[j]<min_weight){                    min_weight=weight[j];                    p=j;                }            }        }        tree[tot].beg=last[p];        tree[tot].en=p;        tree[tot++].length=min_weight;        pos=p;    }    printf("\n最小生成树是:\n");    for(int j=0;j<tot;j++)        printf("\n%c---%c  %d\n",g.vexs[tree[j].beg],g.vexs[tree[j].en],tree[j].length);    printf("\n最小生成树的根是:%c\n",g.vexs[0]);}int  main(){    Mgraph g;    creat(&g,"g.txt",0);  /*创建无向图的邻接矩阵*/    prim(g);        /*求解图的最小生成树*/    return 0;}


地杰斯特拉最短路径(记录路径)

/***************************************************//*          Dijkstra单源最短路径算法               *//***************************************************/#include"ljjz.h"typedef enum {FALSE,TRUE} boolean;typedef int dist[M];typedef int path[M];/*函数参数:图的邻接矩阵g;源点v0;路径向量p;距离向量d*/void dijkstra(Mgraph g,int v0,path last,dist d){    int visit[M];    for(int i=0;i<g.n;i++){        d[i]=INF;        visit[i]=0;    }    int p=v0,old=p;    d[p]=0;    last[old]=-1;    int flag[M];    while(p!=-1)    {        visit[p]=1;        for(int i=0;i<g.n;i++){            if(!visit[i]&&d[p]+g.edges[p][i]<d[i]){                d[i]=d[p]+g.edges[p][i];                flag[i]=p;            }        }        p=-1;        int min=INF;        for(int i=0;i<g.n;i++){            if(!visit[i]&&d[i]<min){                min=d[i];                p=i;                old=flag[i];            }        }        last[p]=old;    }}/*函数参数:邻接矩阵g;路径向量p;距离向量d*/void print_gpd(Mgraph g,path last,dist d){    int way[M],top=-1;    for(int i=0;i<g.n;i++)    {        printf("\nDistancd: %7d , path:",d[i]);        way[++top]=i;        int pre=last[i];        while(pre!=-1)        {            way[++top]=pre;            pre=last[pre];        }        while(top>0)            printf("%2d",way[top--]);    }}int main(){    Mgraph g;   /* 有向图 */    path last;     /* 路径向量 */    dist d;     /* 最短路径向量 */    creat(&g,"g21.txt",1);    print(g);    int v0;    printf("\n请输入源点编号:");    scanf("%d",&v0);    dijkstra(g,v0,last,d);   /*求v0到其他各点的最短距离*/    /*输出V0到其它各点的路径信息及距离*/    print_gpd(g,last,d);    return 0;}



1 0
原创粉丝点击