【算法導論】--C++實現隨機生成100個頂點的無向圖和有向圖

1、題目

算法實驗一(主要是爲以後的圖算法作前期準備工做)ios

->生成100個頂點的圖,隨機生成頂點算法

->無向圖大約1000條邊數組

->有向圖大約2000條邊dom

->計算每一個頂點的度函數

->首先默認每條邊的權重爲1,隨以後的實驗內容再進行修改spa

2、實現

使用鄰接矩陣的方式存儲該圖。code

3、代碼(具體解釋都在註釋中)

  1 /*****************************************************************************
  2 *算法實驗一;
  3 *->生成100個頂點的圖,隨機生成頂點
  4 *->無向圖大約1000條邊
  5 *->有向圖大約2000條邊
  6 *->計算每一個頂點的度
  7 *****************************************************************************/
  8 #include<iostream>
  9 #include<cmath>
 10 #include<ctime>
 11 using namespace std;
 12 
 13 #define maxvertexnum 100 /*最大頂點數設爲100*/
 14 #define infinity 2147483647 /*當兩點不連通時,則它們之間距離爲最大值*/
 15 typedef int vertextype;/*頂點的類型爲整型*/
 16 typedef int edgetype;/*邊的權重爲整形*/
 17 
 18 enum GraphType{DG,UG};/*有向圖,無向圖*/
 19 struct MGraph//鄰接矩陣表示法的結構和類型聲明
 20 {
 21     vertextype V[maxvertexnum];//頂點集
 22     edgetype E[maxvertexnum][maxvertexnum];//邊集
 23     int n,e;//頂點數,邊數
 24     enum GraphType GType;//設定圖的類型
 25 };
 26 
 27 int randomnum()//返回一個0-99之間的隨機數
 28 {
 29     int a;
 30     //srand(time(NULL));//設置隨機數種子,使每次運行獲取的隨機數不一樣
 31     a=rand()%100;
 32 
 33     return a;
 34 }
 35 int* countedge(MGraph *G)//函數返回一個數組
 36 {
 37     int i,j,countnum=0;
 38     int *sum=new int[100];
 39     for(i=0;i<G->n;i++)
 40     {
 41         countnum=0;//到達下一個頂點時置0
 42         for(j=0;j<G->n;j++)
 43         {
 44             if(G->E[i][j]==1)
 45             {
 46                 countnum+=1;
 47                 sum[i]=countnum;//計算每個頂點的度
 48             }
 49         }
 50     }
 51     return sum;
 53 }
 54 
 55 void CreateMGraphUG(MGraph *G)//生成無向圖
 56 {
 57     int i,j,k,w;
 58     G->GType=UG;//無向圖
 59     G->n=100;
 60     G->e=1000;
 61     for(i=0;i<G->n;i++)
 62     {
 63         G->V[i]=i;//爲每一個頂點都編號從0-99
 64     }
 65 
 66     for(i=0;i<G->n;i++)
 67     {
 68         for(j=0;j<G->n;j++)
 69         {
 70             G->E[i][j]=0;//初始化鄰接矩陣
 71         }
 72     }
 73 
 74     for(k=0;k<G->e;k++)
 75     {
 76         i=randomnum();//隨機生成任意兩頂點
 77         j=randomnum();
 78         //cout<<i<<" "<<j<<"\t";
 79         G->E[i][j]=1;//創建鄰接矩陣,邊的權重都爲1
 80         G->E[j][i]=1;//由於是無向圖,因此要對稱
 81     }
 82 
 83 }
 84 
 85 void CreateMGraphDG(MGraph *G)//生成有向圖
 86 {
 87     int i,j,k,w;
 88     G->GType=DG;//有向圖
 89     G->n=100;
 90     G->e=2000;
 91     for(i=0;i<G->n;i++)
 92     {
 93         G->V[i]=i;//爲每一個頂點都編號從0-99
 94     }
 95 
 96     for(i=0;i<G->n;i++)
 97     {
 98         for(j=0;j<G->n;j++)
 99         {
100             G->E[i][j]=infinity;//初始化鄰接矩陣
101         }
102     }
103 
104     for(k=0;k<G->e;k++)
105     {
106         i=randomnum();//隨機生成任意兩頂點
107         j=randomnum();
108         G->E[i][j]=1;//創建鄰接矩陣,邊的權重都爲1
109     }
110 
111 }
112 
113 int main()
114 {
115     MGraph *UGG=new MGraph;//無向圖
116     MGraph *DGG=new MGraph;//有向圖
117     int *ug=new int[100];
118     int *dg=new int[100];
119 
120     cout<<"在無向圖中"<<endl;
121     CreateMGraphUG(UGG);
122     ug=countedge(UGG);
123     for(int i=0;i<100;i++)
124     {
125         cout<<"頂點 【"<<UGG->V[i]<<"】的度爲"<<ug[i]<<endl;
126     }
127 
128     cout<<"在有向圖中"<<endl;
129     CreateMGraphUG(DGG);
130     dg=countedge(DGG);
131     for(int i=0;i<100;i++)
132     {
133         cout<<"頂點 【"<<DGG->V[i]<<"】的度爲"<<dg[i]<<endl;
134     }
135 
136     return 0;
137 }

上述代碼還有不少須要改進之處,期待指正和探討。blog

於2017年4月3日編輯完成。get

相關文章
相關標籤/搜索