若G是一个使用邻接表存储的有向图。请设计一个算法:利用深度优先遍历方法,对该图G中结点进行拓扑排序。
解题思路:在深搜里1.不写取消标记 2.加了一个拓扑数组
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int MAXN=100;
typedef struct ArcNode//边表结点定义
{
int adjvex;
ArcNode *nextarc;
};
typedef struct Vnode//定点表结点定义
{
int data;
ArcNode *firstarc;
};//众所周知,程序员从来不看warning
typedef struct Graph
{
Vnode adjlist[MAXN];
int n;
int e;
}graph;
graph *g=(graph*)malloc(sizeof(graph));
void creategraph(graph *g)
{
int i,j;
printf("n,e= ");
scanf("%d%d",&g->n,&g->e);
printf("g->n==%d\n",g->n);
for(int k=1;k<=g->n;k++)
{
g->adjlist[k].data=k;
g->adjlist[k].firstarc=NULL;
}
printf("输入边的from和to\n");
for(int k=1;k<=g->e;k++)//头插
{
ArcNode *p;
scanf("%d%d",&i,&j);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=g->adjlist[i].firstarc;
g->adjlist[i].firstarc=p;
}
}
void print(graph *g)
{
for(int k=1;k<=g->n;k++)
{
printf("%d ",g->adjlist[k].data);
ArcNode *p=g->adjlist[k].firstarc;
while(p!=NULL)
{
printf("%d ",p->adjvex);
p=p->nextarc;
}
printf("\n");
}
}
int topo[100];
int visit[MAXN];
int t;
bool dfs(int v)
{
visit[v]=1;
ArcNode *p=g->adjlist[v].firstarc;
while(p!=NULL)
{
if(visit[p->adjvex]==0)//若当前结点的邻接结点未被访问
{
dfs(p->adjvex);//访问邻接结点
}
p=p->nextarc;//访问下一个邻接结点
}
//visit[v]=0;取消标记达咩
//printf("v==%d\n",v);
//printf("t==%d\n",t);
topo[t--]=v;//最后被访问的结点最后输出
//printf("topo[%d]==%d\n",t+1,topo[t+1]);
return true;
}
int main()
{
creategraph(g);
print(g);
memset(visit,0,sizeof(visit));
t=g->n;
for(int i=1;i<g->n;i++)
{
if(visit[i]==0)
{
dfs(i);
}
}
for(int i=1;i<=g->n;i++)
{
printf("%d ",topo[i]);
}
return 0;
}
/*
5 5
1 2
1 3
2 4
3 4
4 5
*/