define M 20资料.docx

上传人:b****1 文档编号:10251349 上传时间:2023-05-24 格式:DOCX 页数:20 大小:17.72KB
下载 相关 举报
define M 20资料.docx_第1页
第1页 / 共20页
define M 20资料.docx_第2页
第2页 / 共20页
define M 20资料.docx_第3页
第3页 / 共20页
define M 20资料.docx_第4页
第4页 / 共20页
define M 20资料.docx_第5页
第5页 / 共20页
define M 20资料.docx_第6页
第6页 / 共20页
define M 20资料.docx_第7页
第7页 / 共20页
define M 20资料.docx_第8页
第8页 / 共20页
define M 20资料.docx_第9页
第9页 / 共20页
define M 20资料.docx_第10页
第10页 / 共20页
define M 20资料.docx_第11页
第11页 / 共20页
define M 20资料.docx_第12页
第12页 / 共20页
define M 20资料.docx_第13页
第13页 / 共20页
define M 20资料.docx_第14页
第14页 / 共20页
define M 20资料.docx_第15页
第15页 / 共20页
define M 20资料.docx_第16页
第16页 / 共20页
define M 20资料.docx_第17页
第17页 / 共20页
define M 20资料.docx_第18页
第18页 / 共20页
define M 20资料.docx_第19页
第19页 / 共20页
define M 20资料.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

define M 20资料.docx

《define M 20资料.docx》由会员分享,可在线阅读,更多相关《define M 20资料.docx(20页珍藏版)》请在冰点文库上搜索。

define M 20资料.docx

defineM20资料

#defineM20

#include

#include

#include

/*定义图*/

typedefstruct{

 intV[M];

 intR[M][M];

 intvexnum;

}Graph;

/*创建图*/

voidcreatgraph(Graph*g,intn)

{

 inti,j,r1,r2;

 g->vexnum=n;

 /*顶点用i表示*/

 for(i=1;i<=n;i++)

 {

   g->V[i]=i;

 }

/*初始化R*/

 for(i=1;i<=n;i++)

  for(j=1;j<=n;j++)

   {

     g->R[i][j]=0;

   }

/*输入R*/

 printf("PleaseinputR(0,0END):

\n");

 scanf("%d,%d",&r1,&r2);

 while(r1!

=0&&r2!

=0)

  {

   g->R[r1][r2]=1;

   g->R[r2][r1]=1;

   scanf("%d,%d",&r1,&r2);

  }

}

/*打印图的邻接矩阵*/

voidprintgraph(Graph*g)

{

inti,j;

for(i=1;i<=g->vexnum;i++)

{for(j=1;j<=g->vexnum;j++)

  {

    printf("%2d",g->R[i][j]);

  }

  printf("\n");

  }

}

/*全局变量:

访问标志数组*/

intvisited[M];

/*访问顶点*/

voidvisitvex(Graph*g,intvex)

{

printf("%d",g->V[vex]);

}

/*获取第一个未被访问的邻接节点*/

intfirstadjvex(Graph*g,intvex)

{

intw,i;

for(i=1;i<=g->vexnum;i++)

 {

  if(g->R[vex][i]==1&&visited[i]==0)

   {

     w=i;

     break;

   }

  else

   {

     w=0;

   }

 }

 returnw;

}

/*获取下一个未被访问的邻接节点(深度遍历)*/

intnextadjvex(Graph*g,intvex,intw)

{

 intt;

 t=firstadjvex(g,w);

 returnt;

}

/*深度递归遍历*/

 voiddfs(Graph*g,intvex)

  {

   intw;

   visited[vex]=1;

   visitvex(g,vex);

   for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))

     if(!

visited[w])

      {

dfs(g,w);

      }

  }

  voiddfstraverse(Graph*g)

  {

    inti;

    for(i=1;i<=g->vexnum;i++)

      visited[i]=0;

    for(i=1;i<=g->vexnum;i++)

      if(!

visited[i])

        {dfs(g,i);}

  }

/*定义队列*/

typedefstruct{

intV[M];

intfront;

intrear;

}Queue;

/*初始化队列*/

initqueue(Queue*q)

{

 q->front=0;

 q->rear=0;

}

/*判断队列是否为空*/

intquempty(Queue*q)

{

 if(q->front==q->rear)

 {

  return0;

 }

 else

 {

  return1;

 }

}

/*入队操作*/

enqueue(Queue*q,inte)

{

 if((q->rear+1)%M==q->front)

  {

   printf("Thequeueisoverflow!

\n");

   return0;

  }

  else

  {

   q->V[q->rear]=e;

   q->rear=(q->rear+1)%M;

   return1;

  }

}

/*出队操作*/

dequeue(Queue*q)

{

 intt;

 if(q->front==q->rear)

  {

    printf("Thequeueisempty!

\n");

    return0;

  }

  else

  {

    t=q->V[q->front];

    q->front=(q->front+1)%M;

    returnt;

  }

}

/*广度遍历*/

voidbestraverse(Graph*g)

{

 inti;

 Queue*q=(Queue*)malloc(sizeof(Queue));

 for(i=1;i<=g->vexnum;i++)

 {

  visited[i]=0;

 }

 initqueue(q);

 for(i=1;i<=g->vexnum;i++)

 {

   if(!

visited[i])

    {

      visited[i]=1;

      visitvex(g,g->V[i]);

      enqueue(q,g->V[i]);

      while(!

quempty(q))

       {

         intu,w;

         u=dequeue(q);

         for(w=firstadjvex(g,u);w>0;w=nextadjvex(g,u,w))

           {

             if(!

visited[w])

              {

                visited[w]=1;

  visitvex(g,w);

                enqueue(q,w);

              }

           }

       }

    }

 }

}

/*主程序*/

main()

{

 intn;

 Graph*g=(Graph*)malloc(sizeof(Graph));

 charmenu;

 printf("Pleaseinputthenumberofvertex:

\n");

 scanf("%d",&n);

 creatgraph(g,n);

 printf("Thisisthelinjiejuzhenofgraph:

\n");

 printgraph(g);

 input:

 printf("Choose:

\nb:

Breadth_first\nd:

Depth_first\nq:

quit\n");

 while((menu=getchar())=='\n');

 if(menu=='b')

   {

     printf("Breadth_first:

\n");

     bestraverse(g);

     printf("\n");

     gotoinput;

   }

 elseif(menu=='d')

   {

     printf("Depth_first:

\n");

     dfstraverse(g);

     printf("\n");

     gotoinput;

   }

 elseif(menu=='q')

   {

    exit(0);

   }

 else

   {

     printf("Inputerror!

\nChoose:

\nb:

Breadth_first\nd:

Depth_first\nq:

quit\n");

 

   }}

#defineM20

#include

#include

#include

/*定义图*/

typedefstruct{

 intV[M];

 intR[M][M];

 intvexnum;

}Graph;

/*创建图*/

voidcreatgraph(Graph*g,intn)

{

 inti,j,r1,r2;

 g->vexnum=n;

 /*顶点用i表示*/

 for(i=1;i<=n;i++)

 {

   g->V[i]=i;

 }

/*初始化R*/

 for(i=1;i<=n;i++)

  for(j=1;j<=n;j++)

   {

     g->R[i][j]=0;

   }

/*输入R*/

 printf("PleaseinputR(0,0END):

\n");

 scanf("%d,%d",&r1,&r2);

 while(r1!

=0&&r2!

=0)

  {

   g->R[r1][r2]=1;

   g->R[r2][r1]=1;

   scanf("%d,%d",&r1,&r2);

  }

}

/*打印图的邻接矩阵*/

voidprintgraph(Graph*g)

{

inti,j;

for(i=1;i<=g->vexnum;i++)

{for(j=1;j<=g->vexnum;j++)

  {

    printf("%2d",g->R[i][j]);

  }

  printf("\n");

  }

}

/*全局变量:

访问标志数组*/

intvisited[M];

/*访问顶点*/

voidvisitvex(Graph*g,intvex)

{

printf("%d",g->V[vex]);

}

/*获取第一个未被访问的邻接节点*/

intfirstadjvex(Graph*g,intvex)

{

intw,i;

for(i=1;i<=g->vexnum;i++)

 {

  if(g->R[vex][i]==1&&visited[i]==0)

   {

     w=i;

     break;

   }

  else

   {

     w=0;

   }

 }

 returnw;

}

/*获取下一个未被访问的邻接节点(深度遍历)*/

intnextadjvex(Graph*g,intvex,intw)

{

 intt;

 t=firstadjvex(g,w);

 returnt;

}

/*深度递归遍历*/

 voiddfs(Graph*g,intvex)

  {

   intw;

   visited[vex]=1;

   visitvex(g,vex);

   for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))

     if(!

visited[w])

      {

dfs(g,w);

      }

  }

  voiddfstraverse(Graph*g)

  {

    inti;

    for(i=1;i<=g->vexnum;i++)

      visited[i]=0;

    for(i=1;i<=g->vexnum;i++)

      if(!

visited[i])

        {dfs(g,i);}

  }

/*定义队列*/

typedefstruct{

intV[M];

intfront;

intrear;

}Queue;

/*初始化队列*/

initqueue(Queue*q)

{

 q->front=0;

 q->rear=0;

}

/*判断队列是否为空*/

intquempty(Queue*q)

{

 if(q->front==q->rear)

 {

  return0;

 }

 else

 {

  return1;

 }

}

/*入队操作*/

enqueue(Queue*q,inte)

{

 if((q->rear+1)%M==q->front)

  {

   printf("Thequeueisoverflow!

\n");

   return0;

  }

  else

  {

   q->V[q->rear]=e;

   q->rear=(q->rear+1)%M;

   return1;

  }

}

/*出队操作*/

dequeue(Queue*q)

{

 intt;

 if(q->front==q->rear)

  {

    printf("Thequeueisempty!

\n");

    return0;

  }

  else

  {

    t=q->V[q->front];

    q->front=(q->front+1)%M;

    returnt;

  }

}

/*广度遍历*/

voidbestraverse(Graph*g)

{

 inti;

 Queue*q=(Queue*)malloc(sizeof(Queue));

 for(i=1;i<=g->vexnum;i++)

 {

  visited[i]=0;

 }

 initqueue(q);

 for(i=1;i<=g->vexnum;i++)

 {

   if(!

visited[i])

    {

      visited[i]=1;

      visitvex(g,g->V[i]);

      enqueue(q,g->V[i]);

      while(!

quempty(q))

       {

         intu,w;

         u=dequeue(q);

         for(w=firstadjvex(g,u);w>0;w=nextadjvex(g,u,w))

           {

             if(!

visited[w])

              {

                visited[w]=1;

  visitvex(g,w);

                enqueue(q,w);

              }

           }

       }

    }

 }

}

/*主程序*/

main()

{

 intn;

 Graph*g=(Graph*)malloc(sizeof(Graph));

 charmenu;

 printf("Pleaseinputthenumberofvertex:

\n");

 scanf("%d",&n);

 creatgraph(g,n);

 printf("Thisisthelinjiejuzhenofgraph:

\n");

 printgraph(g);

 input:

 printf("Choose:

\nb:

Breadth_first\nd:

Depth_first\nq:

quit\n");

 while((menu=getchar())=='\n');

 if(menu=='b')

   {

     printf("Breadth_first:

\n");

     bestraverse(g);

     printf("\n");

     gotoinput;

   }

 elseif(menu=='d')

   {

     printf("Depth_first:

\n");

     dfstraverse(g);

     printf("\n");

     gotoinput;

   }

 elseif(menu=='q')

   {

    exit(0);

   }

 else

   {

     printf("Inputerror!

\nChoose:

\nb:

Breadth_first\nd:

Depth_first\nq:

quit\n");

 

   }}

intprim(intg[][max],intn)//最小生成树PRIM算法

{intlowcost[max],prevex[max];//LOWCOST[]存储当前集合U分别到剩余结点的最短路径

//prevex[]存储最短路径在U中的结点

inti,j,k,min;

for(i=2;i<=n;i++)//n个顶点,n-1条边

{lowcost[i]=g[1][i];//初始化

prevex[i]=1;//顶点未加入到最小生成树中

}

lowcost[1]=0;//标志顶点1加入U集合

for(i=2;i<=n;i++)//形成n-1条边的生成树

{min=inf;

k=0;

for(j=2;j<=n;j++)//寻找满足边的一个顶点在U,另一个顶点在V的最小边

if((lowcost[j]

=0))

{min=lowcost[j];

k=j;

}

printf("(%d,%d)%d\t",prevex[k]-1,k-1,min);

lowcost[k]=0;//顶点k加入U

for(j=2;j<=n;j++)//修改由顶点k到其他顶点边的权值

if(g[k][j]

{lowcost[j]=g[k][j];

prevex[j]=k;

}

printf("\n");

}

return0;

}

#include

#include"conio.h"

#defineWERTEX_MAX20//最大顶点数

typedefcharVextype;

typedefstruct//邻接矩阵存储表示

{

}voidprim(MGraphGn,Vextypev0)//最小生成树PRIM算法,从v0出发构造最小生成树

{closedgedge;

inti,j,k;

k=LocatVex(Gn,v0);//查找v0的顶点序号

prinntf("%c->U",V0);//v0并入u集合

for(j=0;j

if(j!

=k)

{dge[j].adjvex=v0;

dge[j].lowcost=Gn.adj[k][j];

}

dge[k].lowcost=0;//初始u={v0}

for(i=0;i

{for(j=0;j

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

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2