找到一个图的,不过不是判断,不知到你用的上用不上
/*
test1: 无向图的邻接表建立与遍历的源程序
test2: 有向无环图的拓扑排序和求关键路径的源程序
*/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 20
struct ArcNode
{ int adjvex;
/* 弧所指向顶点的位置 */
struct ArcNode *nextarc;
/* 指向下一条弧的指针域 */
};
struct Vnode
{ int data;
/* 顶点数据域 */
struct ArcNode *firstarc;
/* 指向第一条依附该顶点的弧的指针域 */
};
struct Vnode AdjList[MaxSize];
int m,n,v;
void test1();
void test2();
void main()
{ clrscr();
// test1();
/* 无向图的邻接链表建立与遍历示范程序 */
test2();
/* 拓扑排序和求关键路径 */
}
void test1() /* 无向图的邻接表示范程序 */
{
int cord;
void creategraph(struct Vnode A[MaxSize]);
void dfs(struct Vnode A[MaxSize]);
void bfs(struct Vnode A[MaxSize]);
printf("* 无向图的邻接链表建立与遍历示范程序 */n"
;
do
{ printf("********主菜单***********/n"
;
printf("
1 建立无向图的邻接链表/n"
;
printf("
2 按深度遍历图/n"
;
printf("
3 按广度遍历图/n"
;
printf("
4 结束程序运行/n"
;
printf("*************************/n"
;
printf("
请输入您的选择号: "
;
scanf("%d",&cord);
switch (cord)
{ case 1: creategraph(AdjList);
break;
case 2: dfs(AdjList);
break;
case 3: bfs(AdjList);
break;
case 4: exit(0);
}
} while(cord<=4);
}
void creategraph(struct Vnode A[MaxSize]) /* 建立无向图 */
{ int i,j,k;
struct ArcNode *p;
struct
{ int x,y;
} b[]={{5,8},{4,8},{6,7},{3,7},{3,6},
{2,5},{2,4},{1,3},{1,2}};
//printf("输入图的边数m和顶点数n(空格隔开): "
;
//scanf("%d%d",&m,&n);
m=9;
n=8;
for (k=0;
k<n;
k++) /* 初始化顶点向量表 */
{ A[k].data=k+1;
A[k].firstarc=NULL;
}
for (k=0;
k<m;
k++)
{ //printf("输入和边关联的顶点号i和j(空格隔开): "
;
//scanf("%d%d",&i,&j);
i=b[k].x;
j=b[k].y;
p=(struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex=j;
p->nextarc=A[i-1].firstarc;
/* 每一个边结点都插入到链表首部 */
A[i-1].firstarc=p;
p=(struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex=i;
p->nextarc=A[j-1].firstarc;
A[j-1].firstarc=p;
}
printf("/n显示邻接链表信息:/n"
;
for (k=0;
k<n;
k++) /* 显示已建立邻接链表信息 */
{ printf("%4d",A[k].data);
p=A[k].firstarc;
while(p)
{ printf("%4d",p->adjvex);
p=p->nextarc;
}
printf("/n"
;
}
}
void dfs(struct Vnode A[MaxSize])/*从一个顶点出发对图作深度优先遍历*/
{ struct ArcNode *p,*ar[MaxSize];/*ar为顺序栈,存放遍历过程边结点地址*/
int x,i,y,top=-1;
int visited[MaxSize];
/* 存放已遍历过的顶点的标记 */
for (i=0;
i<n;
i++) visited
=0;
printf("/n输入遍历出发顶点: "
scanf("%d",&x);
/* 遍历出发顶点的编号 */
visited[x-1]=1;
p=A[x-1].firstarc;
while(p || top>=0)
{ if(!p) { p=ar[top];
top--;
}
y=p->adjvex;
if(visited[y-1]==0)
{ visited[y-1]=1;
/* 若未遍历过,则从本顶点出发继续作深度优先
遍历,并把下一个顶点进栈 */
printf("→%d",y);
p=p->nextarc;
if(p) { top++;
ar[top]=p;
}
p=A[y-1].firstarc;
}
else
p=p->nextarc;
}
printf("/n"
}
void bfs(struct Vnode A[MaxSize])/*从一个顶点出发对图作广度优先遍历*/
{ struct ArcNode *p;
int x,i,y,front=-1,rear=-1;
int ar[MaxSize];
/* ar[]为顺序队列,存放刚遍历过的顶点的编号 */
int visited[MaxSize];
/* 存放已遍历过的顶点的标记 */
for (i=0;
i<n;
i++) visited=0;
printf("/n输入遍历出发顶点: "
scanf("%d",&x);
/* 遍历出发顶点的编号 */
visited[x-1]=1;
p=A[x-1].firstarc;
while(p || front!=rear)
{ if(!p)
{ front++;
y=ar[front];
p=A[y-1].firstarc;
}
y=p->adjvex;
if(visited[y-1]==0)
{ visited[y-1]=1;
/* 若未遍历过,则从本顶点出发继续作广度优先
遍历,并把下一个顶点入队 */
printf("→%d",y);
rear++;
ar[rear]=y;
}
p=p->nextarc;
}
printf("/n"
}
/**********************************************************************/
typedef struct node /* 定义AOV网的邻接链表的边结点结构 */
{ int vex;
struct node *next;
} edgenode;
typedef struct vnode /* 定义AOV网的邻接链表的顶点结点结构 */
{ int id;
struct node *link;
} vexnode;
typedef struct node1 /* 定义AOE网的邻接链表的边结点结构 */
{ int adgvex;
int dut;
struct node1 *next;
} edgenode1;
typedef struct vnode1 /* 定义AOE网的邻接链表的顶点结点结构 */
{ int vertex;
int id;
struct node1 *link;
} vexnode1;
int na;
void test2() /* 有向无环图拓扑排序和求关键路径的示范程序 */
{
int create(vexnode1 dig[]);
int create1(vexnode dig[]);
void toposort(vexnode dig[],int n);
void criticalpath(vexnode1 dig[],int n);
vexnode1 dig[20];
/* AOE的顶点数组 */
vexnode dig2[20];
/* AOV的顶点数组 */
int cord=1;
printf("* 有向无环图拓扑排序和求关键路径的示范程序 */n"
while (cord>=0 &&
cord<5)
{ printf("********主菜单***********/n"
printf("
1 建立AOV邻接表/n"
printf("
2 建立AOE邻接表/n"
printf("
3 拓扑排序(AOV)/n"
printf("
4 求关键路径(AOE)/n"
printf("
0 结束/n"
printf("*************************/n"
printf("
请输入您的选择号: "
scanf("%d",&cord);
switch (cord)
{ case 1: n=create1(dig2);
break;
case 2: { printf("输入AOE活动数: "
scanf("%d",&na);
n=create(dig);
}
break;
case 3: toposort(dig2,n);
/* 须先建AOV网 */
break;
case 4: criticalpath(dig,n);
/* 须先建AOE网 */
break;
case 0: exit(0);
}
}
}
int create(vexnode1 dig[]) /* 建立有向图的AOE网邻接表 */
{ int i,j,a,b,c;
edgenode1 *p;
struct
{ int x,y,z;
} t[]={{0,0,0},{1,4,5},{1,3,4},{1,2,6},{2,5,1},
{3,5,1},{4,6,2},{5,8,5},{5,7,7},{6,8,4},
{7,9,2},{8,9,4},{0,0,0}};
//printf("输入AOE顶点数: "
//scanf("%d%d",&i);
i=9;
for (j=1;
j<20;
j++) /* 初始化顶点数组 */
{ dig[j].vertex=j;
dig[j].id=0;
dig[j].link=NULL;
}
//printf("输入AOE边信息a b c: "
//scanf("%d%d%d",&a,&b,&c);
/* a为始顶点,b为终顶点,c为活动的权 */
j=1;
a=t[j].x;
b=t[j].y;
c=t[j].z;
while(a!=0)
{ dig.id++;
p=(edgenode1 *)malloc(sizeof(edgenode1));
p->adgvex=b;
p->dut=c;
p->next=dig[a].link;
dig[a].link=p;
//printf("输入AOE边信息a b c: "
//scanf("%d%d%d",&a,&b,&c);
/* a为始顶点,b为终顶点,c为活动的权 */
j++;
a=t[j].x;
b=t[j].y;
c=t[j].z;
}
printf("/n显示AOE图邻接链表:/n"
for (j=1;
j<=i;
j++) /* 显示已建立AOE图邻接链表信息 */
{ printf("%4d%4d",j,dig[j].id);
p=dig[j].link;
while(p!=0)
{ printf("%6d%3d",p->adgvex,p->dut);
p=p->next;
}
printf("/n"
}
return i;
}
int create1(vexnode dig[]) /* 建立有向无环图的AOV网邻接表 */
{ int i,j,a,b;
edgenode *p;
struct
{ int x,y;
} t[]={{0,0},{1,2},{1,3},{1,4},{3,2},{3,5},
{4,5},{6,4},{6,5},{0,0}};
//printf("输入AOV顶点数: "
//scanf("%d%d",&i);
i=6;
for (j=1;
j<20;
j++) /* 初始化顶点数组 */
{ dig[j].id=0;
dig[j].link=NULL;
}
//printf("输入AOV边信息a b: "
//scanf("%d%d",&a,&b);
/* a为始顶点,b为终顶点 */
j=1;
a=t[j].x;
b=t[j].y;
while(a!=0)
{ dig.id++;
p=(edgenode *)malloc(sizeof(edgenode));
p->vex=b;
p->next=dig[a].link;
dig[a].link=p;
//printf("输入AOV边信息a b: "
//scanf("%d%d",&a,&b);
/* a为始顶点,b为终顶点 */
j++;
a=t[j].x;
b=t[j].y;
}
printf("/n显示AOV图邻接链表:/n顶点序号 入度id/n"
for (j=1;
j<=i;
j++) /* 显示已建立AOV图邻接链表信息 */
{ printf("%5d%8d",j,dig[j].id);
p=dig[j].link;
while(p!=0)
{ printf("%6d",p->vex);
p=p->next;
}
printf("/n"
}
return i;
}
void toposort(vexnode dig[],int n) /* 有向无环图拓扑排序 */
{ edgenode *p;
int i,j,k,top=0,m=0;
for (i=1;
i<=n;
i++) /* 把入度为0的顶点构成链表 */
if(dig.id==0) { dig.id=top;
top=i;
}
while(top>0)
{ j=top;
top=dig[top].id;
printf("%5d",j);
/* 输出入度为0的顶点 */
m++;
p=dig[j].link;
while(p!=NULL)
{ k=p->vex;
dig[k].id--;
if(dig[k].id==0)
{ dig[k].id=top;
top=k;
}
p=p->next;
}
}
printf("/n"
if (m<n) printf("该网中有环!/n"
}
void criticalpath(vexnode1 dig[],int n) /* 求关键路径 */
{ int front=0,rear=0;
int tpord[20],vl[20],ve[20];
int l[20],e[20],i,j,k,m;
edgenode1 *p;
for (i=1;
i<=n;
i++) ve=0;
for (i=1;
i<=n;
i++)
if(dig.id==0) tpord[++rear]=i;
m=0;
while(front!=rear)
{ front++;
j=tpord[front];
m++;
p=dig[j].link;
while(p)
{ k=p->adgvex;
dig[k].id--;
if(ve[j]+p->dut >
ve[k]) ve[k]=ve[j]+p->dut;
if(dig[k].id==0) tpord[++rear]=k;
p=p->next;
}
}
if(m<n) printf("该AOE网中有一个环!/n"
for (i=1;
i<=n;
i++) vl=ve[n];
for (i=n-1;
i>=1;
i--)
{ j=tpord;
p=dig[j].link;
/* 求vl[]数组的值 */
while(p)
{ k=p->adgvex;
if(vl[k]-p->dut <
vl[j]) vl[j]=vl[k]-p->dut;
p=p->next;
}
}
printf("输出最早、最晚发生时间/n"/*输出每个事件最早、最晚发生时间*/
printf("边起点 边终点 e l l-e/n"
i=0;
for (j=1;
j<=n;
j++) /* 计算活动的最早、最晚发生时间 */
{ p=dig[j].link;
while(p)
{ k=p->adgvex;
e[++i]=ve[j];
l=vl[k]-p->dut;
printf("%d/t%d/t%d/t%d/t%d/t",
dig[j].vertex,dig[k].vertex,e,l,l-e);
if(l==e) printf("是关键活动/n"
else
printf("/n"
p=p->next;
}
}
}