各种基本算法实现小结(四)——图及其遍历
各种基本算法实现小结(四)—— 图及其遍历
(均已测试通过)
====================================================================
图——深度优先和广度优先算法
无向图用二维邻接矩阵表示
测试环境:VC 6.0 (C)
if(visited)
free(visited);
printf("/n");
}
运行结果:
======================================================
图——深度优先
测试环境:VS2008 (C)
======================================================
图——广度优先
测试环境:VS2008 (C)
pn=pqu->front->next;
pqu->front=pqu->front->next;
data=pn->data;
free(pn);
return data;
}
struct _graph
{
char *vexs;
int arcs[MAX_VEX][MAX_VEX];
int vexnum, arcnum;
};
typedef _graph graph, *pgraph;
int locate(graph g, char ch)
{
int i;
for(i=1; i<=g.vexnum; i++)
if(g.vexs[i]==ch)
return i;
return -1;
}
graph create_graph()
{
int i, j, w, p1, p2;
char ch1, ch2;
graph g;
printf("Enter vexnum arcnum: ");
scanf("%d %d", &g.vexnum, &g.arcnum);
getchar();
for(i=1; i<=g.vexnum; i++)
for(j=1; j<g.vexnum; j++)
g.arcs[i][j]=INFINITY;
g.vexs=(char *)malloc((g.vexnum+1)*sizeof(char));
printf("Enter %d vexnum.../n", g.vexnum);
for(i=1; i<=g.vexnum; i++)
{
printf("vex %d: ", i);
scanf("%c", &g.vexs[i]);
getchar();
}
printf("Enter %d arcnum.../n", g.arcnum);
for(i=1; i<=g.arcnum; i++)
{
printf("arc %d: ", i);
scanf("%c %c %d", &ch1, &ch2, &w);
getchar();
p1=locate(g, ch1);
p2=locate(g, ch2);
g.arcs[p1][p2]=g.arcs[p2][p1]=w;
}
return g;
}
int firstvex_graph(graph g, int i)
{
int k;
if(i>=1 && i<=g.vexnum)
for(k=1; k<=g.vexnum; k++)
if(g.arcs[i][k]!=INFINITY)
return k;
return -1;
}
int nextvex_graph(graph g, int i, int j)
{
int k;
if(i>=1 && i<=g.vexnum && j>=1 && j<=g.vexnum)
for(k=j+1; k<=g.vexnum; k++)
if(g.arcs[i][k]!=INFINITY)
return k;
return -1;
}
void bfs(graph g)
{
int i, ivex, inextvex;
visited=(int *)malloc((g.vexnum+1)*sizeof(int));
for(i=1; i<=g.vexnum; i++)
visited[i]=0;
queue qu=init_queue();
for(i=1; i<=g.vexnum; i++)
{
if(!visited[i])
{
visited[i]=1;
printf("%c", g.vexs[i]);
en_queue(&qu, i);
}
while(!empty_queue(qu))
{
ivex=de_queue(&qu);
for(inextvex=firstvex_graph(g, ivex); inextvex>=1; inextvex=nextvex_graph(g, ivex, inextvex))
if(!visited[inextvex])
{
visited[inextvex]=1;
printf("%c", g.vexs[inextvex]);
en_queue(&qu, inextvex);
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
graph g;
g=create_graph();
bfs(g);
printf("/n");
return 0;
}
======================================================
图——深度优先和广度优先算法2(网摘)
本文引用网址:http://bbs.bccn.net/thread-155311-1-1.html(编程论坛)
看到本算法在网上转载较多,比较流行,且能直接运行
但发现大多转载中,也把DFS与BFS正好写反了,对此本文已修正
此外,本算法混用了C与C++,不够单纯,申请的指针空间也未及时释放
测试环境:VC 6.0 (C)
return -1;
}
//创建无向网
void CreateUDN(Graph &G){
int i,j,w,s1,s2;
char a,b,temp;
printf("输入顶点数和弧数: ");
scanf("%d%d",&G.vexnum,&G.arcnum);
temp=getchar(); //接收回车
G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目
printf("输入%d个顶点./n",G.vexnum);
for(i=0;i<G.vexnum;i++) //初始化顶点
{
printf("输入顶点%d: ",i);
scanf("%c",&G.vexs[i]);
temp=getchar(); //接收回车
}
for(i=0;i<G.vexnum;i++) //初始化邻接矩阵
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY;
printf("输入%d条弧./n",G.arcnum);
for(i=0;i<G.arcnum;i++)
{ //初始化弧
printf("输入弧%d: ",i);
scanf("%c %c %d",&a,&b,&w); //输入一条边依附的顶点和权值
temp=getchar(); //接收回车
s1=Locate(G,a);
s2=Locate(G,b);
G.arcs[s1][s2]=G.arcs[s2][s1]=w;
}
}
//图G中顶点k的第一个邻接顶点
int FirstVex(Graph G,int k)
{
if(k>=0 && k<G.vexnum) //k合理
for(int i=0;i<G.vexnum;i++)
if(G.arcs[k][i]!=INFINITY) return i;
return -1;
}
//图G中顶点i的第j个邻接顶点的下一个邻接顶点
int NextVex(Graph G,int i,int j)
{
if(i>=0 && i<G.vexnum && j>=0 && j<G.vexnum) //i,j合理
for(int k=j+1;k<G.vexnum;k++)
if(G.arcs[i][k]!=INFINITY)
return k;
return -1;
}
//深度优先遍历
void DFS(Graph G,int k)
{
int i;
if(k==-1) //第一次执行DFS时,k为-1
{
for(i=0;i<G.vexnum;i++)
if(!visited[i])
DFS(G,i); //对尚未访问的顶点调用DFS
}
else
{
visited[k]=true;
printf("%c ",G.vexs[k]); //访问第k个顶点
for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
if(!visited[i]) //对k的尚未访问的邻接顶点i递归调用DFS
DFS(G,i);
}
}
//广度优先遍历
void BFS(Graph G)
{
int k;
Queue Q; //辅助队列Q
Q.InitQueue();
for(int i=0;i<G.vexnum;i++)
if(!visited[i]) //i尚未访问
{
visited[i]=true;
printf("%c ",G.vexs[i]);
Q.EnQueue(i); //i入列
while(Q.front!=Q.rear)
{
Q.DeQueue(k); //队头元素出列并置为k
for(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))
if(!visited[w]) //w为k的尚未访问的邻接顶点
{
visited[w]=true;
printf("%c ",G.vexs[w]);
Q.EnQueue(w);
}
}
}
}
//主函数
void main(){
int i;
Graph G;
CreateUDN(G);
visited=(bool *)malloc(G.vexnum*sizeof(bool));
printf("/n深度优先遍历: ");
for(i=0;i<G.vexnum;i++)
visited[i]=false;
DFS(G,-1); /* NODE: DFS */
printf("/n广度优先遍历: ");
for(i=0;i<G.vexnum;i++)
visited[i]=false;
BFS(G); /* NODE: BFS */
printf("/n程序结束./n");
}
运行结果:
======================================================
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2010-06-03 21:53:55
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!