程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 有向圖 無向圖和創建(數組表示法)和深度優先訪問

有向圖 無向圖和創建(數組表示法)和深度優先訪問

編輯:C++入門知識

有向圖和無向圖差別就是一句代碼的差別 ,無向圖中代碼注釋掉即可

有向圖和有向網的差別也就是權值的差別  有向網需要賦予權值  有向圖有連線自動賦值為1


深度優先采用遞歸方法(參考前面幾篇文章,裡面有具體的深度優先和廣度優先訪問和隊列基本操作)

廣度優先采用隊列

上代碼

[cpp] #include <stdio.h>  
#include <stdlib.h>  
 
#define OK 1  
#define ERROR -1  
#define OVERFLOW 0  
#define MAXVER 20  //定義最大頂點數  
 
 
typedef enum{UDG,UDN,DG,DN} GraphKind;// 定義無向圖 無向網 有向圖 有向網  
typedef char verType;  //定義頂點類型  
typedef int status ; 
typedef struct  

    verType verx[MAXVER];  //定義頂點  
    int arcs[MAXVER][MAXVER]; //定義弧  
    int vernum,arcsnum;//定義最大頂點數 和弧  
    GraphKind kind;  //類別  
}MGraph; 
 
int visited[MAXVER]={0};  //頂點剛開始都沒被訪問過   
 
//查找頂點在數組中的下標  
int locate(MGraph G,verType ch){ 
    int i; 
    for(i=0;i<G.vernum&&ch!=G.verx[i];i++); 
    return i; 

 
//創建無向圖  
status createUDN(MGraph &G,int &v) 

    int i,j,k; 
    verType ch1,ch2; 
    printf("請輸入無向圖的頂點數和弧數:格式如2 3\n"); 
    scanf("%d%d",&G.vernum,&G.arcsnum);  
    fflush(stdin); 
    printf("請輸入頂點符號:\n"); 
    for(i=0;i<G.vernum;i++){ 
        scanf("%c",&G.verx[i]); 
        fflush(stdin); 
    } 
    for(i=0;i<G.vernum;i++){ 
        for(j=0;j<G.vernum;j++) 
            G.arcs[i][j]=0;  //賦初值為0  
    } 
    printf(" 請輸入有連接的點:格式A B\\n \n"); 
    for(i=0;i<G.arcsnum;i++){ 
        printf("請輸入第%d對值\n",i+1); 
    scanf("%c %c",&ch1,&ch2);  //輸入頂點符號和權值  
    fflush(stdin);  
    k=locate(G,ch1);   //獲得頂點下標  
    j=locate(G,ch2); 
    G.arcs[k][j]=1;  //為臨界矩陣賦值  
    G.arcs[j][k]=G.arcs[k][j];  //無向圖為對稱矩陣  
    } 
    return OK; 

 
//創建有向圖  
status createDN(MGraph &G,int &v) 

    int i,j,k; 
    verType ch1,ch2; 
    printf("請輸入有向圖的頂點數和弧數:格式如2 3\n"); 
    scanf("%d%d",&G.vernum,&G.arcsnum); //  頂點數和弧數輸入  
    fflush(stdin);  //清除回車  
    printf("請輸入頂點符號:\n"); 
    for(i=0;i<G.vernum;i++){ 
        scanf("%c",&G.verx[i]);   //頂點符號輸入  
        fflush(stdin); 
    } 
    for(i=0;i<G.vernum;i++){ 
        for(j=0;j<G.vernum;j++) 
            G.arcs[i][j]=0;  //賦初值為0  
    } 
    printf(" 請輸入頂點符號:格式A B 3\\n \n"); 
    for(i=0;i<G.arcsnum;i++){ 
        printf("請輸入第%d對值\n",i+1); 
    scanf("%c %c",&ch1,&ch2);  //輸入頂點符號和權值  
    fflush(stdin);  
    k=locate(G,ch1);   //獲得頂點下標  
    j=locate(G,ch2); 
    G.arcs[k][j]=1;  //為臨界矩陣賦值  
//  G.arcs[j][k]=G.arcs[k][j];  //無向圖為對稱矩陣  
    } 
    return OK; 

 
//進行深度優先遍歷  
void DFS(MGraph G,int v){  //參數 1 圖 2傳遞進來下標   
    int i; 
    printf("%c ",G.verx[v]);  
    visited[v]=1; 
    for(i=0;i<G.vernum;i++) 
        if(visited[i]==0 && G.arcs[v][i]!=0){ //類型的判斷  是否被訪問過 是否是權值或邊  
            DFS(G,i); 
        } 

 
 
//進行圖的遍歷  
void DFSTravers(MGraph G){  
    int i; 
    for(i=0;i<G.vernum;i++){  
      visited[i]=0; 
    } 
    for(i=0;i<G.vernum;i++){  
        if(visited[i]==0) 
            DFS(G,i); 
    } 

 
int main() 

    MGraph G; 
    int v=0; 
    if(createUDN(G,v)){//創建無向圖  
        printf("遍歷結果為:\n"); 
       DFSTravers(G);  //進行無向圖的遍歷  
    } 
    if(createDN(G,v)){//創建有向圖  
        printf("遍歷結果為:\n"); 
       DFSTravers(G);  //進行有向圖的遍歷  
    } 
    return 0; 

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR -1
#define OVERFLOW 0
#define MAXVER 20  //定義最大頂點數


typedef enum{UDG,UDN,DG,DN} GraphKind;// 定義無向圖 無向網 有向圖 有向網
typedef char verType;  //定義頂點類型
typedef int status ;
typedef struct
{
 verType verx[MAXVER];  //定義頂點
    int arcs[MAXVER][MAXVER]; //定義弧
 int vernum,arcsnum;//定義最大頂點數 和弧
 GraphKind kind;  //類別
}MGraph;

int visited[MAXVER]={0};  //頂點剛開始都沒被訪問過

//查找頂點在數組中的下標
int locate(MGraph G,verType ch){
 int i;
    for(i=0;i<G.vernum&&ch!=G.verx[i];i++);
 return i;
}

//創建無向圖
status createUDN(MGraph &G,int &v)
{
 int i,j,k;
 verType ch1,ch2;
 printf("請輸入無向圖的頂點數和弧數:格式如2 3\n");
 scanf("%d%d",&G.vernum,&G.arcsnum);
 fflush(stdin);
 printf("請輸入頂點符號:\n");
 for(i=0;i<G.vernum;i++){
  scanf("%c",&G.verx[i]);
  fflush(stdin);
 }
 for(i=0;i<G.vernum;i++){
  for(j=0;j<G.vernum;j++)
   G.arcs[i][j]=0;  //賦初值為0
 }
 printf(" 請輸入有連接的點:格式A B\\n \n");
 for(i=0;i<G.arcsnum;i++){
  printf("請輸入第%d對值\n",i+1);
 scanf("%c %c",&ch1,&ch2);  //輸入頂點符號和權值
 fflush(stdin);
 k=locate(G,ch1);   //獲得頂點下標
 j=locate(G,ch2);
 G.arcs[k][j]=1;  //為臨界矩陣賦值
 G.arcs[j][k]=G.arcs[k][j];  //無向圖為對稱矩陣
 }
 return OK;
}

//創建有向圖
status createDN(MGraph &G,int &v)
{
 int i,j,k;
 verType ch1,ch2;
 printf("請輸入有向圖的頂點數和弧數:格式如2 3\n");
 scanf("%d%d",&G.vernum,&G.arcsnum); //  頂點數和弧數輸入
 fflush(stdin);  //清除回車
 printf("請輸入頂點符號:\n");
 for(i=0;i<G.vernum;i++){
  scanf("%c",&G.verx[i]);   //頂點符號輸入
  fflush(stdin);
 }
 for(i=0;i<G.vernum;i++){
  for(j=0;j<G.vernum;j++)
   G.arcs[i][j]=0;  //賦初值為0
 }
 printf(" 請輸入頂點符號:格式A B 3\\n \n");
 for(i=0;i<G.arcsnum;i++){
  printf("請輸入第%d對值\n",i+1);
 scanf("%c %c",&ch1,&ch2);  //輸入頂點符號和權值
 fflush(stdin);
 k=locate(G,ch1);   //獲得頂點下標
 j=locate(G,ch2);
 G.arcs[k][j]=1;  //為臨界矩陣賦值
// G.arcs[j][k]=G.arcs[k][j];  //無向圖為對稱矩陣
 }
 return OK;
}

//進行深度優先遍歷
void DFS(MGraph G,int v){  //參數 1 圖 2傳遞進來下標
 int i;
    printf("%c ",G.verx[v]);
 visited[v]=1;
 for(i=0;i<G.vernum;i++)
  if(visited[i]==0 && G.arcs[v][i]!=0){ //類型的判斷  是否被訪問過 是否是權值或邊
      DFS(G,i);
  }
}


//進行圖的遍歷
void DFSTravers(MGraph G){
 int i;
 for(i=0;i<G.vernum;i++){
   visited[i]=0;
 }
 for(i=0;i<G.vernum;i++){
  if(visited[i]==0)
   DFS(G,i);
 }
}

int main()
{
 MGraph G;
 int v=0;
 if(createUDN(G,v)){//創建無向圖
  printf("遍歷結果為:\n");
    DFSTravers(G);  //進行無向圖的遍歷
 }
 if(createDN(G,v)){//創建有向圖
  printf("遍歷結果為:\n");
    DFSTravers(G);  //進行有向圖的遍歷
 }
 return 0;
}

 \
 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved