给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。
请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。
若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。
输入格式
第一行包含两个整数n和m
接下来m行,每行包含两个整数x和y,表示存在一条从点x到点y的有向边(x, y)。
输出格式
共一行,如果存在拓扑序列,则输出拓扑序列。
否则输出-1。
数据范围
1≤n,m≤1e5
输入样例:
3 3
1 2
2 3
1 3
输出样例:
1 2 3
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MaxVertexNum 500
typedef struct ENode* PtrToENode;
struct ENode {
int V1, V2;
};
typedef PtrToENode Edge;
typedef struct AdjVNode* PtrToAdjVNode;
struct AdjVNode {
int AdjV;
PtrToAdjVNode Next;
};
typedef struct Vnode {
PtrToAdjVNode FirstEdge;
}AdjList[MaxVertexNum];
typedef struct GNode* PtrToGNode;
struct GNode {
int Nv, Ne;
AdjList G;
};
typedef PtrToGNode LGraph;
LGraph CreateGraph(int VertexNum) {
int V;
LGraph Graph;
Graph = (LGraph)malloc(sizeof(struct GNode));
Graph->Nv = VertexNum;
Graph->Ne = 0;
for (V = 1; V <= Graph->Nv; V++)
Graph->G[V].FirstEdge = NULL;
return Graph;
}
void InsertEdge(LGraph Graph, Edge E) {
PtrToAdjVNode NewNode;
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V2;
NewNode->Next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = NewNode;
}
LGraph BuildGraph() {
LGraph Graph;
Edge E;
int V, Nv, i;
scanf("%d", &Nv);
Graph = CreateGraph(Nv);
scanf("%d", &(Graph->Ne));
if (Graph->Ne != 0) {
E = (Edge)malloc(sizeof(struct ENode));
for (i = 0; i < Graph->Ne; i++) {
scanf("%d%d", &E->V1, &E->V2);
InsertEdge(Graph, E);
}
}
return Graph;
}
bool TopSort(LGraph Graph, int TopOrder[]) {
int Indegree[MaxVertexNum], cnt;
int V,front=0,rear=0;
PtrToAdjVNode W;
int Queue[MaxVertexNum];
for (V = 1; V <= Graph->Nv; V++)
Indegree[V] = 0;
for (V = 1; V <= Graph->Nv; V++)
for (W = Graph->G[V].FirstEdge; W; W = W->Next)
Indegree[W->AdjV]++;
for (V = 1; V <= Graph->Nv; V++)
if (Indegree[V] == 0)
Queue[++rear] = V;
cnt = 0;
while (front != rear) {
V = Queue[++front];
TopOrder[cnt++] = V;
for (W = Graph->G[V].FirstEdge; W; W = W->Next)
if (--Indegree[W->AdjV] == 0)
Queue[++rear] = W->AdjV;
}
if (cnt != Graph->Nv)
return false;
else
return true;
}
int main() {
int i,TopOrder[MaxVertexNum];
LGraph Graph;
Graph=BuildGraph();
if (TopSort(Graph, TopOrder)) {
for (i = 0; i < Graph->Nv; i++)
printf("%d ", TopOrder[i]);
}
else
printf("-1");
return 0;
system("pause");
}