算法勘误 图Word格式文档下载.docx
- 文档编号:21020121
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:19.38KB
算法勘误 图Word格式文档下载.docx
《算法勘误 图Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《算法勘误 图Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
p->
nextarc=q;
}
scanf("
//读下一条边
}
}//endofsetadjlist
十字链表形式:
structarctype
inttailvex,headvex;
arctype*hlink,*tlink;
typedefstructarctype*arclink;
typedefstructvnode
vertexdata;
arclinkfirstin,firstout;
}ortholist[max_vertex_num+1];
算法6.2
voidcrt_ortho(ortholistga)//建立有向图的十字链表存储结构
intn,e,k,i,j;
arclinkp,q;
n,&
e);
//输入顶点和弧的数目
getchar();
for(i=1;
=n;
i++)
%c"
ga[i].data);
//输入顶点信息的函数
ga[i].firstin=NULL;
ga[i].firstout=NULL;
//指针初始化
for(k=1;
k<
=e;
k++)
i,&
j);
//输入弧的信息,i是弧尾顶点的编号,j是弧头顶点的编号
q=(arclink)malloc(sizeof(arclink));
headvex=j;
tailvex=i;
hlink=q->
tlink=NULL;
if(NULL==ga[j].firstout)
ga[j].firstout=q;
else
p=ga[j].firstout;
while(p->
tlink)
tlink;
p->
tlink=q;
if(NULL==ga[i].firstin)
ga[i].firstin=q;
p=ga[i].firstin;
hlink)
hlink;
hlink=q;
}//将弧结点分别插入到两个链表中
}
}//endofcrt-ortho
边集数组:
structedge//定义边集数组的元素类型
{
intfromvex;
//边的起点域
intendvex;
//边的终点域
intweight;
//边的权值域,对应无权图可省去此域
typedefstructedgeedgeset[max_arc_num+1];
//定义edgeset为边集数组类型
voidcreatedgeset(vextypegv[],edgesetge,intn,inte)
{//通过从键盘上输入的n个顶点信息和e条边的信息
//建立顶点数组gv和边集数组ge
inti,k,j,w;
gv[i]);
//输入顶点信息
%d%d%d"
j,&
w);
//输入一条边的起点、终点和权值
ge[k].fromvex=i;
ge[k].endvex=j;
ge[k].weight=w;
}
算法6.2(遍历)
voiddfs(adjlistg,intv0,int*visited)
arcptrp;
visite(g,v0);
visited[v0]=1;
p=g[v0].firstarc;
while(p!
if(!
visited[p->
adjvex])
dfs(g,p->
adjvex,visited);
p=p->
};
voiddfs_begin(adjlistg,intv0,intn)
{//假设图G有n个顶点,用邻接表存储G,DFS遍历图G
inti;
int*visited;
visited=(int*)malloc(sizeof(int)*(n+1));
visited[i]=0;
//endofdfs
算法6.3:
voidunrecurrentdfs(adjlistg,integerv0,intn)
{//假设图G用邻接表存储,从顶点v0出发非递归地DFS图G,stack是一栈
int*stack;
stack=(int*)malloc(sizeof(int)*(n+1));
i=1;
//i为栈顶指针
stack[i]=v0;
//v0进栈
while(i!
=0)//若栈不空
{
while(p!
=NULL&
&
p=p->
p)//顶点p的所有邻接点都已访问过了
{
i=i-1;
//退栈
if(i)
p=g[stack[i]].firstarc;
//p取新的栈顶元的邻接点
visite(g,p->
adjvex);
visited[p->
adjvex]=1;
i=i+1;
stack[i]=p->
adjvex;
p=g[p->
adjvex].firstarc;
//endofunrecurrrntdfs
算法6.4:
voidbfs(adjlistg,intv0,intn)
{//从v0出发广度优先遍历图G
intw,v;
QueueQ;
iniqueque(&
Q);
//初始化设置空队列Q
enqueque(&
Q,v0);
//v0进队列Q
while(!
empty(&
Q))//当队列不空时
v=dequeque(&
//队头元素v出队列
p=g[v].firstarc;
//v的第一个邻接点
while(p)//w不是最后一个邻接点
w=p->
if(!
visited[w])
{
visite(g,w);
visited[w]=1;
enqueque(&
Q,w);
//顶点w进队列Q
}
//求下一个邻接点
//求顶点w的下一个邻接点,若w是v的最后一个邻接点,则函数nextadj的值为0
//endofbfs
算法6.5
voidcomp(adjlistg,intn)
{//用DFS或BFS求g的连通分量
intvi;
for(vi=1;
vi<
vi++)
visited[vi]=0;
//标志数组初始化
vi++)
visited[vi])
printf("
aconnectedcomponentis"
);
dfs(g,vi);
//深度遍历,标志数组已经初始化,与前面的dfs算法不同
}//ofcomp
算法6.6
#definen//...//网的顶点数
#definemaxi//网中权的最大值小于maxi
typedefintcosttype[n+1][n+1];
//下标从1开始
voidprim(costtypecost)
intlowcost[n+1];
intclosest[n+1];
inti,j,k,min;
for(i=2;
lowcost[i]=cost[1][i];
closest[i]=1;
n;
i++)//寻找i∈u,k∈v-u,且边{i,k}的权值最小
min=maxi;
k=0;
for(j=2;
j<
j++)
if((lowcost[j]<
min)&
(lowcost[j]!
=0))
{
min=lowcost[j];
k=j;
printf("
%d%5d\n"
k,closest[k]);
//输出生成树的边
lowcost[k]=0;
//k加入u
closest[k]=0;
j<
j++)//调整代价
if((cost[k][j]<
lowcost[j])&
(cost[k][j]!
lowcost[j]=cost[k][j];
closest[j]=k;
}//endfor
}//endofprim
Kruscal算法:
这里我想了一个时间复杂度比较好的算法:
#definemax_arc_num//最大边数
#definev_max//最大顶点数
voidkruscal(edgesetgraph,intr[max_arc_num+1])
{//r[]存放结果r[i]为1的话graph[i]边存在
intresult[max_arc_num+1];
inttimes=1;
inttemp;
intnow=1;
inti,j;
intfirst,second;
=max_arc_num;
result[i]=0;
r[i]=0;
while(times<
v_max)
first=graph[now].endvex;
second=graph[now].fromvex;
if(0==result[first]&
0==result[second])
result[first]=result[second]=now;
r[now]=1;
times++;
if(0==result[first]||0==result[second])
if(0==result[first])
result[first]=result[second];
else
result[second]=result[first];
times++;
r[now]=1;
else
if(result[first]!
=result[second])
{
times++;
temp=result[second];
for(j=1;
j++)
{
if(temp==result[j])
result[j]=result[first];
}
r[now]=1;
}
now++;
算法6.7:
#defineM//图中顶点个数的最大值
#defineNM+1
#defineLENsizeof(structarcnode)
{intadjvex;
structvexnode
{intvexdata;
intindegree;
structarcnode*firstarc;
voidcrt_adjlist(structvexnodedig[N])//读入有向边,建立图G的邻接表
structarcnode*p;
intk,m,i;
=N;
i++)//表头结点初始化
dig[i].vexdata=i;
dig[i].firstarc=NULL;
dig[i].indegree=0;
printf("
\npleaseinputthearc\n"
k,&
m);
//k为弧尾,m为弧头
while(!
(k==0&
m==0))//生成邻接表,表头结点的degree域为每个顶点的入度
p=(structarcnode*)malloc(LEN);
p->
adjvex=m;
nextarc=dig[k].firstarc;
//新的弧结点插入在单链表的表头
dig[k].firstarc=p;
dig[m].indegree++;
//入度加1
voidtopsort(structvexnodedig[N])//拓扑排序
intm,i,j,top,k,stack[N];
structarcnode*q;
top=-1;
//栈初始化
i++)//入度为零的顶点进栈
if(dig[i].indegree==0)
stack[++top]=i;
m=0;
//输出顶点的计数器
while(top!
=-1)//栈不空
j=stack[top--];
//j取栈顶元素,栈顶元素退栈
%5d"
dig[j].vexdata);
m++;
q=dig[j].firstarc;
//在邻接表上查找j的所有后继k,将k的入度减1
while(q!
k=q->
if(--dig[k].indegree==0)stack[++top]=k;
//若k的入度为零,让k进栈
q=q->
if(m<
N)printf("
thegraphhasrecycle"
算法6.8:
#defineN6//顶点数
#defineMAX1000//max是计算机允许的最大值
voidshortpath(intcost[N][N],intv)
{//cost为带权有向图的邻接矩阵,v为指定的源点,数据从0开始储存
intdist[N],s[N],rear[N];
//dist[i]为当前源点到顶点i的最小距离,s表示相应顶点是否并入集合的标志
intq[N][N];
//到i顶点的最短路径存储在队列q[i]中,队头指针为0,队尾指针存储在rear[i]中。
inti,j,k,win,m;
for(i=0;
N;
i++)//初始化s和rear
s[i]=0;
rear[i]=-1;
i++)//初始化dist和q
dist[i]=cost[v][i];
if(dist[i]<
MAX)
q[i][++rear[i]]=v;
q[i][++rear[i]]=i;
s[v]=1;
//v并入集合
for(k=0;
N-1;
k++)//并入n-1个顶点,即求n-1条最短路径
win=MAX;
j=v;
for(i=1;
i++)//选最小的dist[j]
if(s[i]==0&
dist[i]<
win)
j=i;
win=dist[i];
if(j!
=i)
s[j]=1;
\nthe%d'
sshortestdistanceis%d\n"
j,dist[j]);
for(i=0;
=rear[j];
printf("
q[j][i]);
//打印从源点到j的最短路径
for(i=1;
i++)//修改从源点到其余各点的最短距离
if(s[i]==0&
((dist[j]+cost[j][i])<
dist[i]))//现在从源点经过j到i比原来要短则修改
dist[i]=dist[j]+cost[j][i];
for(m=0;
m<
m++)
q[i][m]=q[j][m];
//修改相应的路径
rear[i]=rear[j];
q[i][++rear[i]]=i;
}//if
}//if
}//for
}//end
算法6.9
voidfloyed(intgraph[MAX+1][MAX+1],intpath[MAX+1][MAX+1][MAX+1])//下标从1开始
inti,j,k,l,n,m;
inta[MAX+1][MAX+1];
for(k=1;
=MAX;
for(i=1;
for(j=1;
path[i][j][k]=0;
for(j=1;
if(0!
=graph[i][j])
a[i][j]=graph[i][j];
path[i][j][1]=i;
path[i][j][2]=j;
a[i][j]=0;
if(a[i][k]!
=0&
a[k][j]!
((a[i][k]+a[k][j]<
a[i][j])||0==a[i][j]))
a[i][j]=a[i][k]+a[k][j];
for(l=1,m=1,n=2;
l<
l++)
if(0!
=path[i][k][m])
{
path[i][j][l]=path[i][k][m];
m++;
}
else
if(0!
=path[k][j][n])
{
path[i][j][l]=path[k][j][n];
n++;
}
else
break;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法勘误 算法 勘误