图的基本操作文档格式.docx

上传人:b****5 文档编号:20263822 上传时间:2023-01-21 格式:DOCX 页数:16 大小:17.20KB
下载 相关 举报
图的基本操作文档格式.docx_第1页
第1页 / 共16页
图的基本操作文档格式.docx_第2页
第2页 / 共16页
图的基本操作文档格式.docx_第3页
第3页 / 共16页
图的基本操作文档格式.docx_第4页
第4页 / 共16页
图的基本操作文档格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

图的基本操作文档格式.docx

《图的基本操作文档格式.docx》由会员分享,可在线阅读,更多相关《图的基本操作文档格式.docx(16页珍藏版)》请在冰豆网上搜索。

图的基本操作文档格式.docx

intK;

//////表示遍历过的节点数

intchoose;

//////主菜单选择变量

intNum,Number;

//////Num表示顶点的个数,number表示的为边的个数

voidBuild_VAdjacencyList()///////建立并初始化头结点

inti;

for(i=0;

i<

Num;

i++)

{

AdjList[i].data=i+1;

AdjList[i].fistarc=NULL;

}

}

voidBuildAdjacencyList()///////////建立邻接表,当然,在建立邻接表的同时也建立了此图的图的有向图邻接矩阵以及无向图的邻接矩阵

inta,b,c,i,j;

ArcNode*p,*s;

printf("

请输入图中顶点的个数:

\n"

);

scanf("

%d"

&

Num);

Build_VAdjacencyList();

for(j=0;

j<

j++)

if(i==j)

{

map[i][j]=0;

map2[i][j]=0;

}

else

map[i][j]=MAX;

map2[i][j]=MAX;

请输入图中边的个数:

Number);

请输入各条边的两个顶点以及边的权值:

Number;

scanf("

%d%d%d"

a,&

b,&

c);

if(map2[a-1][b-1]>

c)///////建立此图的有向图的邻接矩阵

{

map2[a-1][b-1]=c;

}

if(map[a-1][b-1]>

c)/////这里的2个if为建立此图的无向图的邻接矩阵

map[a-1][b-1]=c;

if(map[b-1][a-1]>

c)/////

map[b-1][a-1]=c;

p=AdjList[a-1].fistarc;

/////一下是建立邻接表

if(p==NULL)

s=(ArcNode*)malloc(sizeof(ArcNode));

s->

adjvex=b-1;

weight=c;

nextarc=NULL;

AdjList[a-1].fistarc=s;

else

while(p->

nextarc!

=NULL)

p=p->

nextarc;

p->

nextarc=s;

}

voidShowAdjacencyList()///////以邻接表的形式输出各顶点所连接的点

if(Num==0)

printf("

请先建立有向图!

else

inti;

ArcNode*p;

for(i=0;

printf("

从%d直接可达的点有:

"

i+1);

p=AdjList[i].fistarc;

while(p!

printf("

%d、"

p->

adjvex+1);

voidShowAdjacencyListDegree()//////////////////以邻接表的形式输出各顶点的度

inti,j,sum;

sum=0;

sum++;

for(j=0;

if(j!

=i)

{

p=AdjList[i].fistarc;

while(p!

{

if(p->

adjvex==i)

sum++;

p=p->

}

}

顶点%d的度为:

%d\n"

i,sum);

voidTopologicalSortAdjacencyList()///////邻接表的拓扑排序

memset(topocount,0,sizeof(topocount));

memset(topoflag,0,sizeof(topoflag));

inti,sum,k=0;

sum=0;

while(sum<

Num)

for(i=0;

if(topoflag[i]==0)

topoflag[p->

adjvex]=1;

}

topoflag[i]=2;

topocount[sum]=i+1;

sum++;

break;

if(i==Num+1)

此有向图有环!

k=1;

break;

if(topoflag[i]==1)

topoflag[i]=0;

if(k==0)

%d"

topocount[i]);

voidDFS(ArcNode*s)

ArcNode*p;

while(s!

if(flag[s->

adjvex]==0)

s=s->

flag[s->

adjvex]=0;

num[K]=s->

adjvex;

K++;

p=AdjList[s->

adjvex].fistarc;

DFS(p);

}

voidDFSAdjacencyList()///////////////////对邻接表进行深度优先遍历

inti,k;

K=0;

flag[i]=1;

for(k=0;

k<

k++)

if(flag[k]==1)

num[K]=k;

K++;

p=AdjList[k].fistarc;

DFS(p);

深度优先遍历的顺序为:

num[i]+1);

voidBFSAdjacencyList()///////对邻接表进行广度优先遍历

inti,j;

j=0;

memset(count,0,sizeof(count));

if(flag[i]==1)

flag[i]=0;

num[K]=i;

while(j<

K)

p=AdjList[num[j]].fistarc;

j++;

if(flag[p->

adjvex]==1)

{

num[K]=p->

K++;

flag[p->

}

广度优先遍历的顺序为:

voidAdjacencyListPrim()///////////////////用Prim算法对邻接矩阵求最小生成树

intmin1,pi,i,j,ans=0;

flag[i]=0;

count[i]=map[0][i];

flag[0]=1;

count[0]=0;

for(i=1;

min1=MAX;

if(flag[j]==0&

&

count[j]<

min1)

min1=count[j];

pi=j;

if(min1==MAX)

图不连通!

return;

flag[pi]=1;

count[j]>

map[pi][j])

count[j]=map[pi][j];

i++)

ans+=count[i];

}

ans);

voidAdjacencyListDijkstra()////////////对邻接矩阵对各顶点到其他顶点的最短距离,在此用的是Dijkstra算法

intmin1,pi,i,j,k;

memset(flag,0,sizeof(flag));

memset(count,0,sizeof(count));

count[i]=map2[k][i];

flag[k]=1;

count[k]=0;

for(i=1;

min1=MAX;

for(j=0;

if(flag[j]==0&

min1=count[j];

pi=j;

flag[pi]=1;

count[pi]+map2[pi][j])

count[j]=count[pi]+map2[pi][j];

map3[k][i]=count[i];

}

if(i==j)

continue;

if(map3[i][j]!

=MAX)

printf("

顶点%d与顶点%d之间的最短距离为:

i+1,j+1,map3[i][j]);

else

+∞\n"

i+1,j+1);

voidShowMenu()//////////////////////菜单

-----------------------------------------------------\n"

|对图的操作如下:

|\n"

|1.建立有向图;

2.输出该临接表|\n"

|3.输出个顶点的度;

4.进行拓扑排序|\n"

|5.深度优先遍历;

6.广度优先遍历|\n"

|7.无向图最小生成树;

8.有向图求最短路径|\n"

|0.退出|\n"

请选择想要进行的操作:

choose);

intmain()///////////////////////////////////主函数

Num=0;

Number=0;

ShowMenu();

while

(1)

if(choose==0)

break;

elseif(choose==1)

BuildAdjacencyList();

ShowMenu();

elseif(choose==2)

ShowAdjacencyList();

elseif(choose==3)

ShowAdjacencyListDegree();

elseif(choose==4)

TopologicalSortAdjacencyList();

elseif(choose==5)

DFSAdjacencyList();

elseif(choose==6)

BFSAdjacencyList();

elseif(choose==7)

AdjacencyListPrim();

elseif(choose==8)

AdjacencyListDijkstra();

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1