#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;
}
测试用例一:


测试用例二:

