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


一、題目

算法實驗一(主要是為之后的圖算法做前期准備工作)

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

->無向圖大約1000條邊

->有向圖大約2000條邊

->計算每個頂點的度

->首先默認每條邊的權重為1,隨之后的實驗內容再進行修改

二、實現

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

三、代碼(具體解釋都在注釋中)

  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 }

上述代碼還有很多需要改進之處,期待指正和探討。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM