数据结构试验四 --图论
来源:互联网 发布: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
- 数据结构试验四 --图论
- 数据结构试验四
- 数据结构试验四 栈与字符串
- 数据结构试验
- 试验四
- 数据结构试验:二叉排序树
- 数据结构试验-Sqlist
- 数据结构试验-Linklist
- 数据结构试验-Polynomial
- 数据结构试验源码
- 数据结构试验 顺序表
- 数据结构试验二:链表
- 2016数据结构试验1.2
- 数据结构第七次试验
- 数据结构试验-试验9-图及其应用
- SDUT 1480 数据结构试验: 哈希表
- graph--数据结构试验(题目)
- graph--数据结构试验(代码)
- LeetCode学习篇二十五——Balanced Binary Tree
- Javascript: unterminated string literal 解决方法
- axis2系列之返回json数据
- html页面跳转传递参数
- 批量修改文件名
- 数据结构试验四 --图论
- Java多线程锁对象的改变
- JS唤醒Android APP(包括在外部浏览器和WebView)
- Java基础第一阶段——02_Java语言基础_关键字&变量&运算
- 最短路径——SPFA算法(蓝桥杯试题集)
- java基础-集合框架9 增强for循环
- 带外数据
- 算法学习-最大连续子数组
- 动态添加控件