您现在的位置是:主页 > news > 南宁网站排名优化电话/推广普通话海报

南宁网站排名优化电话/推广普通话海报

admin2025/5/5 15:44:57news

简介南宁网站排名优化电话,推广普通话海报,衡水网页网站建设,公司如何做网站做推广拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序。 1、每个顶点出现且只出现一次 2、若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径。 引言…

南宁网站排名优化电话,推广普通话海报,衡水网页网站建设,公司如何做网站做推广拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序。 1、每个顶点出现且只出现一次 2、若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径。 引言…

拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序。
1、每个顶点出现且只出现一次
2、若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径。

在这里插入图片描述
引言:

#include"邻接表创建有向图.cpp"

这个邻接表创建有向图的cpp头文件,写法参考上篇博客 “邻接表建立无向图 c/c++” ,去掉建立边表的第二个头插法即可~

1、邻接表存储结构

#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#define MAXVEX 20
typedef char VertexType;
using namespace std;
//边表结点 
typedef struct EdgeNode{int adjvex;struct EdgeNode *next;
}EdgeNode;//顶点表结点
typedef struct VertexNode{VertexType data;EdgeNode *firstedge;
}VertexNode,AdjList[MAXVEX];typedef struct{AdjList adjlist;int numVertexes,numEdges;
}GraphAdjList;

2、构造有向无环图

#include"邻接表存储结构.cpp" 
//创建邻接表
void Create(GraphAdjList &G){int i,j,k;EdgeNode *p;printf("输入顶点数和边数:\n");cin>>G.numVertexes>>G.numEdges;//输入顶点信息printf("输入顶点信息:\n");for(i=0;i<G.numVertexes;i++){cin>>G.adjlist[i].data;G.adjlist[i].firstedge=NULL;           //将指向边表的指针初始化 } //建立边表printf("输入边(Vi,Vj)中的下标i,j:\n"); for(k=0;k<G.numEdges;k++){scanf("%d%d",&i,&j);EdgeNode *p=new EdgeNode();//c++写法 p->adjvex=j;                                //存储弧头 p->next=G.adjlist[i].firstedge;            //头插法插入边结点 G.adjlist[i].firstedge=p;//        //下面代码有向图无,无向图有 
//        p=(EdgeNode *)malloc(sizeof(EdgeNode));//c写法 
//        p->adjvex=i;                                //存储弧头 
//        p->next=G.adjlist[j].firstedge;            //头插法插入边结点 
//        G.adjlist[j].firstedge=p;}//打印邻接表printf("邻接表为:\n");for(i=0;i<G.numVertexes;i++){p=G.adjlist[i].firstedge;while(p){printf("(%c,%c)",G.adjlist[i].data,G.adjlist[p->adjvex].data);p=p->next;}printf("\n");} 
} 

3、拓扑排序算法:(重点)

#include<stack>
#include<vector>
#include"邻接表创建有向图.cpp"
using namespace std;
stack<int>s;//栈初始化 
const int maxn=100;
vector<int>indegree(100);
void visit(GraphAdjList G){int i,j;EdgeNode *p;for(i=0;i<G.numVertexes;i++){p=G.adjlist[i].firstedge;while(p){int val=p->adjvex; indegree[val]+=1; p=p->next;}}cout<<"每个结点的入度"<<endl; for(i=0;i<G.numVertexes;i++)cout<<indegree[i]<<" ";
}bool TopologicalSort(GraphAdjList G){EdgeNode *p;int i,j;for(i=0;i<G.numVertexes;i++){if(indegree[i]==0)s.push(i);}
//	cout<<endl<<s.top();int count=0,cur;cout<<endl<<"拓扑排序为:";while(!s.empty()){cur=s.top();cout<<cur;s.pop();//栈顶元素出栈for(p=G.adjlist[cur].firstedge;p;p=p->next){int v=p->adjvex;//边表结点if(!(--indegree[v]))s.push(v); }		}if(count<G.numVertexes)return false;//排序失败 return true;
}
int main(){GraphAdjList G;Create(G);visit(G);//计算每个结点的入度 TopologicalSort(G);//拓扑排序 
}/*
输入顶点数和边数:
5 5
输入顶点信息:
0 1 2 3 4
输入边(Vi,Vj)中的下标i,j:
0 1
1 3
2 3
2 4
3 4
邻接表为:
(0,1)
(1,3)
(2,4)(2,3)
(3,4)每个结点的入度
0 1 0 2 2
拓扑排序为:20134
*/ 

在这里插入图片描述