#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define maxSize 101
int INF = -2313;
int MINF = 6666;//定义图的图的无穷大量
typedef struct MGraph
{
int n,e;
int edges[maxSize][maxSize];
};
//邻接表
typedef struct ArcNode
{
int adjvex;//该点所指顶点的位置信息
ArcNode *nextarc;//指向下一条边
} ArcNode;
typedef struct
{
int data;
int count;//统计入度信息
ArcNode *firstarc;//指向第一条边
} VNode,AdjList;
typedef struct AGraph
{
AdjList adjlist[maxSize];
int n,e;
} AGraph;
int visit[1001];
//邻接矩阵转化为邻接表
void creatAGraph(AGraph *G,MGraph M)
{
G->e = M.e;
G->n = M.n;
for(int i=0; i<M.n; i++) //构造顶点表
{
G->adjlist[i].data = i;
G->adjlist[i].firstarc = NULL;
G->adjlist[i].count = 0;
}
ArcNode *p;
for(int i=0; i<M.n; i++) //头插法来构造
{
for(int j=0; j<M.n; j++)
if(M.edges[i][j]!=0)//当存在边的时候采用头插法来构造
{
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G->adjlist[i].firstarc;
G->adjlist[i].firstarc = p;
G->adjlist[j].count++;//对应的入度加1
}
}//end for
}
void Visit(int v)
{
printf("->%d",v);
}
int topSort(AGraph *G)
{
int i,j,n = 0;
stack<int> S;
ArcNode *p;
for(i=0; i<G->n; i++) //将顶点入度为0的点入栈
if(G->adjlist[i].count ==0)
S.push(i);
while(!S.empty())
{
i = S.top();
printf("%d->",i);
S.pop();
n++;
p = G->adjlist[i].firstarc;
//将p连接的边的入度减1
while(p)
{
j = p->adjvex;
--(G->adjlist[j].count);
if(G->adjlist[j].count ==0)//减完之后入度等于0则将器入栈
S.push(j);
p = p->nextarc;//指向吓一调边
}//end while
}//end while
if(n == G->n)
return 1;
else
return 0;
}