1. 程式人生 > >圖的鄰接矩陣儲存與遍歷

圖的鄰接矩陣儲存與遍歷

    #include <stdio.h>
        #include<queue>       ///呼叫STL佇列庫函式
        #include<stack>        ///呼叫STL棧庫函式
        #include<string.h>
        #define max 20
        using namespace std;
        int visited[max]={0};
        typedef struct Arccell{
            int adj;
        }Arccell,Adjm[max][max];
        typedef struct{
            int vexs[max];
            Adjm arcs;
            int vex,arc;
        }Mgraph;
        int Locatevex(Mgraph &G,int v)
        {
          int i,k=-1;
               for(i=0;i<G.vex;i++)
                    if(v==G.vexs[i])
                    {
                       k=i;
                       break;
                    }
              return k;
        }

        void CreateGraph(Mgraph &G)
        {
            int i,j,k;
            int s;
            int v1,v2;
            printf ("輸入圖的頂點數與邊數:\n");
            scanf("%d%d",&G.vex,&G.arc);
           printf("輸入頂點資訊:\n");
           for(i=0;i<G.vex;i++)
             {
                 scanf("%d",&s);
                 G.vexs[i]=s;
             }
             for(i=0;i<G.vex;i++)  ///初始化鄰接矩陣
                 for(j=0;j<=G.vex;j++)
                G.arcs[i][j].adj=0;
                 printf("輸入一邊依附的兩個頂點:\n");
             for(k=0;k<G.arc;k++)
               {
                   scanf("%d%d",&v1,&v2);
                  i=Locatevex(G,v1);
                  j=Locatevex(G,v2);
              if((i!=-1)&&(j!=-1))
              G.arcs[i][j].adj=1;
               G.arcs[j][i]=G.arcs[i][j];
               }
        }

    void DFS (Mgraph G,int v)
    {
            int i;
            visited[v]=1;
           printf("%d ",G.vexs[v]);
            for (i=0;i<G.vex;i++)
                if (!visited[i] && G.arcs[v][i].adj)
                DFS(G,i);
    }
    void DFStravel1(Mgraph G)
    {///DFS遞迴遍歷
            int i;
            for (i=0;i<G.vex;i++)
            {
                if (!visited[i])
                DFS(G,i);
            }
    }
    void DFStravel2(Mgraph G,int v)
    {///DFS非遞迴遍歷
        stack<int>s;
        printf("%d ",G.vexs[v]);
        visited[v]=1;
        s.push(v);
        while(!s.empty())
       {
        int i,j;
        i=s.top();
            for(j=0;j<G.vex;j++)
           {
                 if(G.arcs[i][j].adj==1 && !visited[j])
                 {
                    printf("%d ",G.vexs[j]);
                    visited[j]=1;
                    s.push(j);
                    break;
                 }
           }
           if (j==G.vex)
           {
               s.pop();
           }
        }
    }

        void BFStravel(Mgraph G)
        {///BFS非遞迴遍歷
             int i,j,k;
        int v;
        queue <int>q;
        for(i=0;i<G.vex;i++)
        {
            if(!visited[i])
            {
                printf("%d ",G.vexs[i]);
                visited[i]=1;
                q.push(G.vexs[i]);
                while(!q.empty())
                {
                    v=q.front();
                    q.pop();
                    k=Locatevex(G,v);
                    for(j=0;j<G.vex;j++)
                    {
                        if(!visited[j] && G.arcs[k][j].adj)
                        {
                            visited[j]=1;
                            printf("%d ",G.vexs[j]);
                            q.push(G.vexs[j]);
                        }
                    }
                }
            }
        }
        }
        void printGraph(Mgraph &G)
        {
             int i,j;
             for(i=0;i<G.vex;i++)
              {
                for(j=0;j<G.vex;j++)
                printf("%2d",G.arcs[i][j].adj);
               printf("\n");
              }
        }
        int main ()
        {
            Mgraph g;
            int i;
             CreateGraph (g);
             printGraph (g);
             printf ("深度優先遞迴遍歷:\n");
             DFStravel1 (g);
             printf ("\n");
             printf ("深度優先非遞迴遍歷:\n");
             for(i=0;i<g.vex;i++)
                visited[i]=0;
             for(i=0;i<g.vex;i++)
             {
                 if (!visited[i])
                 {
                     DFStravel2(g,i);
                 }
             }
             printf ("\n");
             memset (visited,0,sizeof(visited));
             printf ("廣度優先遍歷:\n");
             BFStravel(g);
             return 0;
        }