实验五 图to studentWord格式.docx
《实验五 图to studentWord格式.docx》由会员分享,可在线阅读,更多相关《实验五 图to studentWord格式.docx(14页珍藏版)》请在冰豆网上搜索。
vtx;
edgenode
*link;
}vexnode;
typedef
vexnode
Graph[n];
void
Floyd(GraphG,floatA[n][n],intp[n][n])
{
i,
j,
k;
for
(i=0;
i<
n;
i++)
for(j=0;
j<
j++)
{
A[i][j]=G[i][j];
P[i][j]=-1;
}
(k=0;
k<
k++)
for(i=0;
for(j=0;
j<
j++)
if(A[i][k]+A[k][j]<
A[i][j])
P[i][j]=k;
A[i][j]=A[i][k]+A[k][j];
}
五、思考与提高(直接将答案写在小题后面)
1.判断两点是否可达。
2.如何对程序进行修改,找一条人最少的公交线路?
3.练习图的拓扑排序
六、调试以下参考程序代码,并将运行效果截图
1.图的建立与遍历
#include<
conio.h>
stdio.h>
stdlib.h>
string.h>
#defineMAX_VERTEX_NUM20//图的最大顶点数
#defineMAXQSIZE30//队列的最大容量
enumBOOL{False,True};
typedefstructArcNode
{intadjvex;
//该弧所指向的顶点的位置
structArcNode*nextarc;
//指向下一条弧的指针
}ArcNode;
//弧结点
typedefstruct
{ArcNode*AdjList[MAX_VERTEX_NUM];
//指向第一条依附该顶点的弧的指针
intvexnum,arcnum;
//图的当前顶点和弧数
intGraphKind;
//图的种类,0---无向图,1---有向图
}Graph;
typedefstruct//队列结构
{intelem[MAXQSIZE];
//数据域
intfront;
//队头指针
intrear;
//队尾指针
}SqQueue;
BOOLvisited[MAX_VERTEX_NUM];
//全局变量——访问标志数组
voidCreateGraph(Graph&
);
//生成图的邻接表
voidDFSTraverse(Graph);
//深度优先搜索遍历图
voidDFS(Graph,int);
voidBFSTraverse(Graph);
//广度优先搜索遍历图
voidInitial(SqQueue&
//初始化一个队列
BOOLQueueEmpty(SqQueue);
//判断队列是否空
BOOLEnQueue(SqQueue&
int);
//将一个元素入队列
BOOLDeQueue(SqQueue&
int&
//将一个元素出队列
intFirstAdjVex(Graph,int);
//求图中某一顶点的第一个邻接顶点
intNextAdjVex(Graph,int,int);
//求某一顶点的下一个邻接顶点
voidmain()
{GraphG;
//采用邻接表结构的图
charj='
y'
;
printf("
本程序将演示生成一个图,并对它进行遍历.\n"
printf("
首先输入要生成的图的种类.\n"
0---无向图,1--有向图\n"
之后输入图的顶点数和弧数。
\n格式:
顶点数,弧数;
例如:
4,3\n"
接着输入各边(弧尾,弧头).\n例如:
\n1,2\n1,3\n2,4\n"
程序会生成一个图,并对它进行深度和广度遍历.\n"
深度遍历:
1->
2->
4->
3\n广度遍历:
3->
4\n"
while(j!
='
N'
&
j!
n'
)
{printf("
请输入要生成的图的种类(0/1):
"
scanf("
%d"
&
G.GraphKind);
//输入图的种类
请输入顶点数和弧数:
%d,%d"
G.vexnum,&
G.arcnum);
//输入图的顶点数和弧数
CreateGraph(G);
//生成邻接表结构的图
DFSTraverse(G);
BFSTraverse(G);
图遍历完毕,继续进行吗?
(Y/N)"
%c"
j);
}
G)
{//构造邻接表结构的图G
inti;
intstart,end;
ArcNode*s;
for(i=1;
i<
=G.vexnum;
i++)G.AdjList[i]=NULL;
//初始化指针数组
=G.arcnum;
i++)
{scanf("
start,&
end);
//输入弧的起点和终点
s=(ArcNode*)malloc(sizeof(ArcNode));
//生成一个弧结点
s->
nextarc=G.AdjList[start];
//插入到邻接表中
adjvex=end;
G.AdjList[start]=s;
if(G.GraphKind==0)//若是无向图,再插入到终点的弧链中
{s=(ArcNode*)malloc(sizeof(ArcNode));
nextarc=G.AdjList[end];
adjvex=start;
G.AdjList[end]=s;
voidDFSTraverse(GraphG)
{//深度优先遍历图G
DFSTraverse:
i++)visited[i]=False;
//访问标志数组初始化
if(!
visited[i])DFS(G,i);
//对尚未访问的顶点调用DFS
\b\b\n"
voidDFS(GraphG,inti)
{//从第i个顶点出发递归地深度遍历图G
intw;
visited[i]=True;
//访问第i个顶点
%d->
i);
for(w=FirstAdjVex(G,i);
w;
w=NextAdjVex(G,i,w))
visited[w])DFS(G,w);
//对尚未访问的邻接顶点w调用DFS
voidBFSTraverse(GraphG)
{//按广度优先非递归的遍历图G,使用辅助队列Q和访问标志数组visited
inti,u,w;
SqQueueQ;
BFSTreverse:
=G.vexnum;
Initial(Q);
//初始化队列
visited[i])
{visited[i]=True;
//访问顶点i
EnQueue(Q,i);
//将序号i入队列
while(!
QueueEmpty(Q))//若队列不空,继续
{DeQueue(Q,u);
//将队头元素出队列并置为u
for(w=FirstAdjVex(G,u);
w=NextAdjVex(G,u,w))
visited[w])//对u的尚未访问的邻接顶点w进行访问并入队列
{visited[w]=True;
w);
EnQueue(Q,w);
intFirstAdjVex(GraphG,intv)
{//在图G中寻找第v个顶点的第一个邻接顶点
G.AdjList[v])return0;
elsereturn(G.AdjList[v]->
adjvex);
intNextAdjVex(GraphG,intv,intu)
{//在图G中寻找第v个顶点的相对于u的下一个邻接顶点
ArcNode*p;
p=G.AdjList[v];
while(p->
adjvex!
=u)p=p->
nextarc;
//在顶点v的弧链中找到顶点u
if(p->
nextarc==NULL)return0;
//若已是最后一个顶点,返回0
elsereturn(p->
nextarc->
//返回下一个邻接顶点的序号
Q)
{//队列初始化
Q.front=Q.rear=0;
BOOLQueueEmpty(SqQueueQ)
{//判断队列是否已空,若空返回True,否则返回False
if(Q.front==Q.rear)returnTrue;
elsereturnFalse;
Q,intch)
{//入队列,成功返回True,失败返回False
if((Q.rear+1)%MAXQSIZE==Q.front)returnFalse;
Q.elem[Q.rear]=ch;
Q.rear=(Q.rear+1)%MAXQSIZE;
returnTrue;
Q,int&
ch)
{//出队列,成功返回True,并用ch返回该元素值,失败返回False
if(Q.front==Q.rear)returnFalse;
ch=Q.ele