数据结构-图的进阶代码
来源:互联网 发布:b站镇站之宝 知乎 编辑:程序博客网 时间:2024/06/05 15:52
1.BFS算法求解单源最短路径(BFS总是按照距离由近到远来遍历)
#define MAX_VERTEX_NUM 1024#define INFINITY 0bool visited[MAX_VERTEX_NUM];Sequeue Q;int d[MAX_VERTEX_NUM];void BFS_MIN_Distance(Graph G,int u){//d[i]表示u到i节点最短路径for(int i=0;i<G.vexnum;++i)d[i]=INFINITY;InitQueue(Q);visited[u]=TRUE;EnQueue(Q,u);while(!isEmpty(Q)){DeQueue(Q,u);for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w))if(!visited[w]){visited[w]=TRUE;d[w]=d[u]+1;EnQueue(Q,w);}}}
2.判断图是否是一棵树(是否是连通图)
#define MAX_VERTEX_NUM 1024bool visited[MAX_VERTEX_NUM];bool IsTree(Graph G){if(G.vexnum!=G.arcnum-1)//不满足树的性质直接falsereturn FALSE;for(int i=0;i<G.vexnum;i++)visited[i]=FALSE;DFS(G,0);for(int i=0;i<G.vexnum;i++)if(visited[i]==FALSE)return FALSE;//进行一次DFS有一个孤立点就falsereturn TRUE;} void DFS(Graph G,int v){visited[v]=TRUE;for(int w=FirstNeighbor(G,v);w>=0;w=NextNeighor(G,v,w))//图为邻接矩阵存储if(!visited[w])DFS(G,w);}
3.设图邻接表存储,设计一个算法,输出顶点Vi到顶点Vj所有简单路径
#define MAX_VERTEX_NUM 1024#define INFINITE -65535bool visited[MAX_VERTEX_NUM];int path[MAX_VERTEX_NUM];void PrintAllSimplenessPath(ALGraph G,int From,int To){for(int i=0;i<G.vexnum;i++)visited[i]=FALSE;FindPath(G,From,To,0);}void FindPath(ALGraph G,int From,int To,int len){if(visited[From])return;path[len]= From;visited[u]=TRUE;if(From==To){for(int i=0;i<len;i++)printf(“%d\t”path[i]);visited[From]=FALSE;return;}for(AcrNode *w=G.vertices[From];w;w->next)FindPath(G,w->next,To,len+1);visited[From]=FALSE;}
#define MAX_VERTEX_NUM 1024bool visited[MAX_VERTEX_NUM];void DFS(ALGraph G){for(int i=0;i<G.vexnum;i++)visited[i]=FALSE;SeqStack S;for(int i=0;i<G.vexnum;i++){if(!visited[i]){Push(S,i);while(!IsEmpty(S)){int v=Pop(S);if(!visited[v]){visited[v]=TRUE;printf(“%d ”,v);for(ArcNode *w=G.vertices[v];w;w=w->next)if(!visited[w->adjvex])Push(S,w->adjvex);}}}}}
5.设无向图G采用邻接表结构存储,试编写算法计算G中包含的连通分量的数量。
bool visited[MaxVertexNum];int CountSubGraphs(ALGraph G){for(int i=0;i<G->n;i++)visisted[i]=false;int count=0;for(int i=0;i<G->n;i++){if(!visited[i]){DFS(G,i);count++;}}return count;}void DFS(ALGraph G,int v){visited[v]=true;ArcNode *p=G=>adjList[v].first;while(p){if(!visited[p->data])DFS(G,p->data);p=p->next;}}
6.在有向图中,我们将入度和出度相等的顶点定义为“平衡顶点”。编写一个算法输出一个采用邻接表存储结构的有向图中所有的平衡顶点。
int InDegree[MaxVertexNum];int OutDegree[MaxVertexNum];void BalanceNodes(ALGraph G){for(int i=0;i<G->vexnum;i++)InDegree[i]=OutDegree[i]=0;ArcNode *p;for(int i=0;i<G->vexnum;i++){p=G->AdjList[i]->first;while(p){OutDegree[i]++;InDegree[p->data]++;p=p->next;}for(int i=0;i<G->vexnum;i++)if(InDegree[i]==OutDegree[i])cout<<i<<”\t”;}}
7.假设图采用邻接表存储,试设计算法判断顶点i和顶点j(i不等于j)之间是否有路径。
#define MaxVertexNum 100bool visited[MaxVertexNum];bool DFSTrave(ALGraph G,int From,int To){for(int i=0;i<G->vexnum;i++)visited[i]=0;DFS(G,From);if(visited[To])return true;return flase;}void DFS(ALGraph G,int v){visited[v]=true;ArcNode *p=G=>adjList[v].first;while(p){if(!visited[p->data])DFS(G,p->data);p=p->next;}}
8.假设一个连通图采用邻接表作为存储结构,设计一个算法,判断其中是否存在回路。
bool JudeCycle(ALGraph G){bool has=false;if(G->vexnum==2){//两个顶点的连通图单独来判断if(G->arcnum==1) has=true;}elseCycle(G,1,has)//假如顶点是从1开始return has;}void Cycle(ALGraph G,int v,bool &has){//调用has时置初值为falseArcNode *p;int w;visited[v]=true;p=G->AdjList[v].first;while(p){w=p->adjvex;if(!visited[w])Cycle(G,w,has);else{has=true;return;}p=p->next;}}
阅读全文
0 0
- 数据结构-图的进阶代码
- 数据结构-树的进阶代码
- 数据结构-排序进阶代码
- 数据结构:图的代码
- 数据结构-进阶高手的大门
- 数据结构-图的基础代码
- JNI编程进阶 数据结构对象的传递
- 数据结构进阶(三)数据结构之树的遍历
- C++代码,数据结构-连通图的关节点
- 图的邻接矩阵数据结构代码实现
- 数据结构实验的代码
- 数据结构的代码
- 数据结构的一些代码
- 数据结构的代码实现
- 我的代码进阶之步
- 【数据结构】单链表--进阶题目
- 数据结构中链表的建立代码
- redis代码 支持的数据结构
- myc归来!(1)第2次测试
- 剖析Disruptor:为什么会这么快?(一)锁的缺点
- Scala中类private
- css系列之左右+垂直布局(传统和flex)
- pstree
- 数据结构-图的进阶代码
- centos7 E568: duplicate cscope database not added
- VoIP通信技术网教你如何加入通信企业黄页?
- 汇编语言程序和数据的关系
- 使用AT指令配置ESP8266开启透传模式
- WordPress本地安装主题
- ionic当前页面刷新
- 为什么子类中不能访问另一个包中父类中的protected方法?
- 解决App Store 上架 IOS 程序必须支持IPV6