1、最小生成树(prim算法)
//prim算法的思想:选择一个初始顶点,把它加入辅助数组,计算该顶点到其他顶点的代价,选择其中最小代价对应点加入辅助数组,扫描加入新的顶点有没有使其到各个顶点的代价变化,并更新代价数组;重复进行以上步骤,知道所有顶点都已经加入了辅助数组
//记录顶点集U到V-U的代价最小的边的辅助数组
struct{
VertexType adjvex;
VRType lowcost;
}closedge[MAX_VERTEX_NUM];
void MiniSpanTree_PRIM(MGraph G,VetexType u){
//用prim算法从第v个顶点出发构造网的最小生成树T,并输出最小生成树的各条边
k=LocateVex(G,u);
for(j=0;j<G.vexnum;j++) //辅助数组初始化
if(j!=k) closedge[j]={u,G.arcs[k][j].adj}; //{adjvex,lowcost}
closedge[k].lowcost=0; //初始,U={u}
for(i=1;i<G.vexnum;++i){ //选择其余G.vexnum-1个顶点
k=minimum(closedge); //求出T的下一个顶点:第k顶点
printf(closedge[k].adjvex,G.vexs[k]);
closedge[k].lowcost=0;
for(j=0;j<G.vexnum;++j)
if(G.arcs[k][j]).adj<closedge[j].lowcost)
closedge[j]={G.vexs[k],G.arcs[k][j].adj};
}
} //MiniSpanTree2、单源最短路径
BFS可用于求不带权的图的单源最短路径(课本上没有)
bool viisted[Max_VeTex_num];
void BFS_Min_Distance(Graph G,int v){
//BFS求无向图的单源最短路径
for(int i=0;i<G.vexNum;i++){
d[i]=Inifinate; //最短路径大小
path[i]=-1; //最短路径从哪里过来
}
d[v]=0; //起点到自己的距离置为0;
visited[v]=true;
EnQueue(Q,v);
while(!IsEmpty(Q)){
DeQueue(Q,v);
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)){
if(!visited[w]){
visited[w]=true;
EnQueue(Q,w);
d[w]=d[v]+1;
path[w]=u;
}
}
}
}3、拓扑排序
Status TopologicalOrder(ALGraph G,Stack &T){
//有向网G采用邻接表存储结构,求各顶点事件最早发生时间ve(全局变量)
//T为拓扑序列顶点栈,S为零入度顶点栈
//若G无回路,则栈T返回G的一个拓扑序列,且函数值为OK,否则为ERROR
FindInDegree(G,indegree); //对各顶点求入度indegree[0...vernum-1]
InitStack(S); //建立并初始化零入度顶点栈
count=0;ve[0...G.vexnum-1]=0; //初始化
while(!StackEmpty(S)){
Pop(S,j); Push(T,j);++count; //j号顶点入T栈并计数
for(p=G.vertices[j].firstarc;p;p->nextarc){
k=p->adjvex; //对j号顶点的每个邻接点的入度减1
if(--indgree[k]==0) Push(S,k); //若入度减为0,则入栈
if(ve[j]+*(p->info)>ve[k]) ve[k]=ve[j]+*(p->info) ;
}
}
if(count<G.vexnum) return ERROR; //该有向图有回路
else retrun OK;
}
京公网安备 11010502036488号