#include "stdlib.h"
#include "stdio.h"
#define MAXN 20
#define INF 65535
#define TRUE 1
#define FALSE 0
typedef struct MGraph
{
int n,e;
int a[MAXN][MAXN];
int adj[MAXN];
}MGraph;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
int data;
ArcNode *firstarc;
}VNode;
typedef struct AGraph
{
int n,e;
VNode adjlist[MAXN];
}AGraph;
void CreateGraph(MGraph *g,int a[][MAXN],int n,int e)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g->a[i][j]=a[i][j];
g->n=n;
g->e=e;
}
void DispGraph(MGraph g)
{
int i,j;
for (i=0;i<g.n;i++)
{
for (j=0;j<g.n;j++)
if (g.a[i][j]<INF)
printf("%4d",g.a[i][j]);
else
printf("%4s","∞");
printf("\n");
}
}
void MtoA(MGraph g, AGraph *ag)
{
int i,j;
ArcNode *p;
ag->n=g.n;ag->e=g.e;
for(i=0;i<g.n;i++)
{
ag->adjlist[i].firstarc=NULL;
}
for(i=0;i<g.n;i++)
{
for(j=0;j<g.n;j++)
{
if(g.a[i][j]!=0&&g.a[i][j]!=INF)
{
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;p->nextarc=NULL;
p->nextarc=ag->adjlist[i].firstarc;
ag->adjlist[i].firstarc =p;
}
}
}
}
void showAGraph(AGraph ag)
{
int i;
ArcNode *p;
for(i=0;i<ag.n;i++)
{
p=ag.adjlist[i].firstarc;
printf(" %d ",i);
while(p!=NULL)
{
printf("%d ",p->adjvex);
p=p->nextarc;
}
printf("\n");
}
}
int finished[MAXN];
void mdfs(MGraph g,int v)
{
finished[v]=TRUE;
printf("%d ",v);
for(int i=0;i<g.n;i++)
{
if(finished[i]!=TRUE&&g.a[v][i]!=0&&g.a[v][i]!=INF)
mdfs(g,i);
}
}
void adfs(AGraph ag, int v)
{
ArcNode *p;int k;
finished[v]=TRUE;
printf("%d ",v);
p=ag.adjlist[v].firstarc;
while(p!=NULL)
{ k=p->adjvex;
if(finished[k]!=TRUE)
adfs(ag,k);
p=p->nextarc;
}
}
void mbfs(MGraph g, int v)
{
int qu[100];int f=0;int r=0;
int k;
finished[v]=TRUE;
printf(" %d ",v);
qu[r++]=v;
while(f!=r)
{
k=qu[f++];
for(int i=0;i<g.n;i++)
{
if(finished[i]!=TRUE&&g.a[v][i]!=0&&g.a[v][i]!=INF)
{
finished[i]=TRUE; printf(" %d ",i);
qu[r++]=i;
}
}
}
}
void abfs(AGraph ag, int v)
{
int qu[100];int f=0;int r=0;
ArcNode *p;int k;
finished[v]=TRUE;
printf(" %d ",v);
qu[r++]=v;
while(f!=r)
{
k=qu[f++];
p=ag.adjlist[k].firstarc;
while(p!=NULL)
{
if(finished[p->adjvex]!=TRUE)
{
finished[p->adjvex]=TRUE; printf(" %d ",p->adjvex);
qu[r++]=p->adjvex;
}
p=p->nextarc;
}
}
}
void topo(AGraph ag)
{
int indgree[MAXN];
int mystack[MAXN];
int top=0;
int k;
ArcNode *p;
for(int i=0;i<ag.n;i++)
indgree[i]=0;
for(int i=0;i<ag.n;i++)
{
p=ag.adjlist[i].firstarc;
while(p!=NULL)
{
indgree[p->adjvex]++;
p=p->nextarc;
}
}
for(int i=0;i<ag.n;i++)
if(indgree[i]==0)
mystack[top++]=i;
if(top==0) {printf("error\n");return;}
while(top!=0)
{k=mystack[--top];
printf(" %d ",k);
p=ag.adjlist[k].firstarc;
while(p!=NULL)
{
indgree[p->adjvex]--;
if(indgree[p->adjvex]==0)
mystack[top++]=p->adjvex;
p=p->nextarc;
}
}
}
int main()
{
MGraph g;
AGraph ag;
int n=5,e=7,i;
int A[MAXN][MAXN]={{0,1,2,6,INF},{INF,0,INF,4,5},{INF,INF,0,INF,3},{INF,INF,INF,0,INF},{INF,INF,INF,7,0}};
CreateGraph(&g,A,n,e);
printf("matrix storage:\n");
DispGraph(g);
MtoA(g,&ag);
printf("adjacency storage:\n");
showAGraph(ag);
printf("dfs:\n");
for(int i=0;i<n;i++)
finished[i]=FALSE;
for(int i=0;i<n;i++)
{
if(finished[i]!=TRUE)
mdfs(g,i);
}
printf("dfs:\n");
for(int i=0;i<n;i++)
finished[i]=FALSE;
for(int i=0;i<n;i++)
{
if(finished[i]!=TRUE)
adfs(ag,i);
}
printf("\n bfs :\n");
for(int i=0;i<n;i++)
finished[i]=FALSE;
for(int i=0;i<n;i++)
{
if(finished[i]!=TRUE)
mbfs(g,i);
}
printf("\n bfs :\n");
for(int i=0;i<n;i++)
finished[i]=FALSE;
for(int i=0;i<n;i++)
{
if(finished[i]!=TRUE)
abfs(ag,i);
}
printf("\n topo :\n");
topo(ag);
printf("\nfinished\n");
}