- #include <iostream>
- #include <queue>
- #include <string>
- using namespace std;
- //表结点
- typedef struct ArcNode{
- int adjvex;//该弧所指向的顶点的位置
- ArcNode *nextarc;
- }ArcNode;
- //头结点
- typedef struct VNode{
- string data;//顶点信息
- ArcNode *firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针
- }VNode, AdjList[10];
- typedef struct ALGraph{
- AdjList vertices;
- int vexnum, arcnum;
- }ALGraph;
- int LocateVex(ALGraph G, string u)//返回顶点u在图中的位置
- {
- for(int i=0; i<G.vexnum; i++)
- if(G.vertices[i].data==u)
- return i;
- return -1;
- }
- void CreateDG(ALGraph &G)//构造有向图
- {
- string v1, v2;
- int i, j, k;
- cout<<"请输入顶点数和边数:";
- cin>>G.vexnum>>G.arcnum;
- cout<<"请输入顶点:";
- for(i=0; i<G.vexnum; i++)
- {
- cin>>G.vertices[i].data;
- G.vertices[i].firstarc=NULL;
- }
- cout<<"请输入边:"<<endl;
- for(k=0; k<G.arcnum; k++)
- {
- cin>>v1>>v2;
- i=LocateVex(G, v1);
- j=LocateVex(G, v2);
- ArcNode* arc=new ArcNode;
- arc->adjvex=j;
- arc->nextarc=G.vertices[i].firstarc;
- G.vertices[i].firstarc=arc;
- }
- }
- void FindIndegree(ALGraph G, int indegree[])//求顶点的入度
- {
- for(int i=0; i<G.vexnum; i++)
- indegree[i]=0;
- for(i=0; i<G.vexnum; i++)
- {
- ArcNode *p=G.vertices[i].firstarc;
- while(p)
- {
- indegree[p->adjvex]++;
- p=p->nextarc;
- }
- }
- }
- void TopologicalSort(ALGraph G)//拓扑排序
- {
- queue<int> q;
- int indegree[10]={0};//入度数组
- int count=0;//计数,计入队数
- FindIndegree(G, indegree);
- for(int i=0; i<G.vexnum; i++)//入度为0的顶点入队
- if(0==indegree[i])
- q.push(i);
- while(!q.empty())
- {
- int v=q.front();
- q.pop();
- count++;
- cout<<G.vertices[v].data<<" ";
- ArcNode *p=G.vertices[v].firstarc;
- while(p)//出队后,每个邻接点入度减1
- {
- if(!(--indegree[p->adjvex]))
- q.push(p->adjvex);//入度为0的顶点入队
- p=p->nextarc;
- }
- }
- if(count<G.vexnum)//由此判断有向图是否有回路
- cout<<"该有向图有回路"<<endl;
- }
- void main()
- {
- ALGraph G;
- CreateDG(G);
- cout<<"拓扑排序:";
- TopologicalSort(G);
- cout<<endl;
- }
测试用例一:
测试用例二: