数据结构---拓扑排序

给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前 

 输入

        若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号

输出

        若干个空格隔开的顶点构成的序列(用小写字母)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MaxSize = 20;
struct edge_Node
{
int data;
edge_Node* next;
};
struct head_Node
{
int indegree;
int data;
edge_Node* first;
};
class Graph
{
public:
Graph(string Vertex[],int vNum,int eNum)
{
edge_Node* s;
this->vertexNum = vNum;
this->edgeNum = eNum;
for (int i = 0; i < this->vertexNum; i++)
{
vertex[i] = Vertex[i];
headList[i].data = i;
headList[i].first = NULL;
headList[i].indegree = 0;
}
for (int j = 0; j < this->edgeNum; j++)
{
int front, rear;
cin >> front >> rear;
front = front - 1;
rear = rear - 1;
headList[rear].indegree++;
s = new edge_Node;
s->data = rear;
s->next = headList[front].first;//头插法
headList[front].first = s;
}
}
void top_Sort()
{
int rear = -1;
int Q[MaxSize];
int p;
edge_Node* ptr = NULL;
for (int i = 0; i < vertexNum; i++)
{
if (headList[i].indegree == 0)
{
Q[++rear] = i;
}
}
sort(Q, Q + (rear + 1),greater<int>());
while (rear != -1)
{
p = Q[rear--];
cout << vertex[headList[p].data]<<" ";
ptr = headList[p].first;
while (ptr != NULL)
{
headList[ptr->data].indegree--;
if (headList[ptr->data].indegree == 0)
{
Q[++rear] = ptr->data;
}
ptr = ptr->next;
}
sort(Q, Q + (rear + 1), greater<int>());
}
}
private:
int vertexNum;
int edgeNum;
string vertex[MaxSize];
head_Node headList[MaxSize];
};
int main()
{
string data[] = { "v1","v2","v3","v4","v5","v6","v7","v8"};
int vNum, eNum;
cin >> vNum >> eNum;//输入顶点和边的个数
Graph graph(data, vNum, eNum);
graph.top_Sort();
return 0;
}

posted @   破忒头头  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示