通信网络设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{x=y;f=z;}
z=y;
y=v2link[y];
}
if(f==-1)
s=v2link[x];
else
v2link[f]=v2link[x];
vset[x]=1;
ecount++; /*边数计数*/
}
printf(“\nroot%c:\t”, G[k].vtx); /*输出结点*/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ if((gali[i][j]<max)&&(gali[i][j]!=0))
{ se=(edgenode*)malloc(sizeof(*se));
se->no=j;
se->next=ga[i].link;
se->wgt=gali[i][j];
ga[i].link=se;
}
prim(G,4);
return 0;
}
while(ecount<n-1)
{ptr=G[x].link;
while(ptr!=Null)
{y=ptr->no;
if((vset[y]= =2)&&(ptr->wgt<w[y])) /*y在集合v2*/
{parent[y] = x; w[y]=ptr->wgt;}
if(vset[y]= =3) /*y在集合v3*/
}
}
}
}
main()
{inti;
edgenode*ve;
creatlist(G);
for(i=0;i<n;i++)
{printf(“\nv%c=link:”,G[i].vtx);
ve=G[i].link;
while(ve!=Null)
{printf(“%d w=%.2f\t”,ve->no,ve->wgt);ve=ve->next;}
{if(i!=k)
{printf(“\%c”,G[i].vtx);
f=parent[i];
printf(“\%c\t”, G[f].vtx);
}
}
}
voidcreatlist(vexnodega[])
{inti, j, k, e, w;
edgenode*se;
for(i=0;i<n;i++)
{ga[i].vtx=’a’+i;
}vexnode;
floatgali[n][n] = {{0,2,12,10,max},{2,0,8,max,9},{12,8,0,6,3},{10,max,6,0,7},{max,9,3,7,0}};
typedefvexnodeGraph[n];
Graph G;
void prim(vexnodeG[],intk)
{intv2link[n],vset[n],parent[n],w[n];
edgenode*ptr;
intx, s,ecount,i, y, z, f;
s=-1;
x = k;
vset[k] = -1;
v2link[n] = -1;
ecount=0;
for(i=0;i<n;i++)
if(i!=k)vset[i]=3;
{vset[y]=2;
v2link[y]=s;
s=y;
parent[y] = x;
w[y]=ptr->wgt;
}
ptr=ptr->next;
}
if(s= =-1)
break; /*无最小代价生成树*/
z=x=s;
y=v2link[x];
f=-1;
while(y!=-1)
{ if(w[y]<w[x])
(1)设置一个顶点的集合S1和一个边的集合TE,S1和TE的初始状态皆为空集。
(2)选定图中的一个顶点k(从此顶点开始求最小代价生成树),将k加入集合S1。
(3)重复下列步骤,直至选取了n-1条边:
1选取一条权值最小的边(x,y),其中x□S1,y□S1。
②将顶点y加入集合S1,边(x,y)加入集合TE。
如果以无向网表示N个城市之间通信网络的建设计划,顶点表示城市,边上的权表示该线路的造价,设计一个方案,使这个通信网的总造价最低。
实现提示:
这是一个求连通的带权无向图的最小代价生成树的问题。建立图的邻接矩阵,然后以prime算法来求最小生成树。
算法实现:
设图的顶点集合V有Baidu Nhomakorabea个顶点,prime算法粗略描述如下:
参考程序:
#include<stdio.h>
# define n 5
# define max 1000.0
typedefstructnode
{intno;
floatwgt;
structnode *next;
}edgenode;
typedefstruct
{ charvtx;
edgenode*link;
z=y;
y=v2link[y];
}
if(f==-1)
s=v2link[x];
else
v2link[f]=v2link[x];
vset[x]=1;
ecount++; /*边数计数*/
}
printf(“\nroot%c:\t”, G[k].vtx); /*输出结点*/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ if((gali[i][j]<max)&&(gali[i][j]!=0))
{ se=(edgenode*)malloc(sizeof(*se));
se->no=j;
se->next=ga[i].link;
se->wgt=gali[i][j];
ga[i].link=se;
}
prim(G,4);
return 0;
}
while(ecount<n-1)
{ptr=G[x].link;
while(ptr!=Null)
{y=ptr->no;
if((vset[y]= =2)&&(ptr->wgt<w[y])) /*y在集合v2*/
{parent[y] = x; w[y]=ptr->wgt;}
if(vset[y]= =3) /*y在集合v3*/
}
}
}
}
main()
{inti;
edgenode*ve;
creatlist(G);
for(i=0;i<n;i++)
{printf(“\nv%c=link:”,G[i].vtx);
ve=G[i].link;
while(ve!=Null)
{printf(“%d w=%.2f\t”,ve->no,ve->wgt);ve=ve->next;}
{if(i!=k)
{printf(“\%c”,G[i].vtx);
f=parent[i];
printf(“\%c\t”, G[f].vtx);
}
}
}
voidcreatlist(vexnodega[])
{inti, j, k, e, w;
edgenode*se;
for(i=0;i<n;i++)
{ga[i].vtx=’a’+i;
}vexnode;
floatgali[n][n] = {{0,2,12,10,max},{2,0,8,max,9},{12,8,0,6,3},{10,max,6,0,7},{max,9,3,7,0}};
typedefvexnodeGraph[n];
Graph G;
void prim(vexnodeG[],intk)
{intv2link[n],vset[n],parent[n],w[n];
edgenode*ptr;
intx, s,ecount,i, y, z, f;
s=-1;
x = k;
vset[k] = -1;
v2link[n] = -1;
ecount=0;
for(i=0;i<n;i++)
if(i!=k)vset[i]=3;
{vset[y]=2;
v2link[y]=s;
s=y;
parent[y] = x;
w[y]=ptr->wgt;
}
ptr=ptr->next;
}
if(s= =-1)
break; /*无最小代价生成树*/
z=x=s;
y=v2link[x];
f=-1;
while(y!=-1)
{ if(w[y]<w[x])
(1)设置一个顶点的集合S1和一个边的集合TE,S1和TE的初始状态皆为空集。
(2)选定图中的一个顶点k(从此顶点开始求最小代价生成树),将k加入集合S1。
(3)重复下列步骤,直至选取了n-1条边:
1选取一条权值最小的边(x,y),其中x□S1,y□S1。
②将顶点y加入集合S1,边(x,y)加入集合TE。
如果以无向网表示N个城市之间通信网络的建设计划,顶点表示城市,边上的权表示该线路的造价,设计一个方案,使这个通信网的总造价最低。
实现提示:
这是一个求连通的带权无向图的最小代价生成树的问题。建立图的邻接矩阵,然后以prime算法来求最小生成树。
算法实现:
设图的顶点集合V有Baidu Nhomakorabea个顶点,prime算法粗略描述如下:
参考程序:
#include<stdio.h>
# define n 5
# define max 1000.0
typedefstructnode
{intno;
floatwgt;
structnode *next;
}edgenode;
typedefstruct
{ charvtx;
edgenode*link;