您现在的位置是:主页 > news > 南宁网站排名优化电话/推广普通话海报
南宁网站排名优化电话/推广普通话海报
admin2025/5/5 15:44:57【news】
简介南宁网站排名优化电话,推广普通话海报,衡水网页网站建设,公司如何做网站做推广拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序。 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
*/