怎样随机生成一个有n个顶点的无向连通图,用C++怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样随机生成一个有n个顶点的无向连通图,用C++怎么写?相关的知识,希望对你有一定的参考价值。

可以的话 再顺便问下 求其中两个点的最短路径用C++怎么写?

1、使用随机函数rand生成随机数即可。

2、例程:

#define MAX_DISTANCE 100000
bool** G;//图,G[i][j]=true表示顶点i和j相邻
int N;//图的顶点个数
int **D;//D[i][j]表示点i和点j的距离
void floyd()
    //initialize
    for (int i=0;i<N;i++)
    
        for (int j=0;j<N;j++)
        
            if (G[i][j])//i和j连通,则他们的距离是1
            
                D[i][j]=1;
                D[j][i]=1;
            else//否则不可达
                D[i][j]=MAX_DISTANCE;
            
        
    
    //floyd
    for (int k=0;k<N;k++)
    
        for (int i=0;i<N;i++)
        
            for (int j=0;j<N;j++)
            
                if (D[i][j]>D[i][k]+D[k][j])
                
                    D[i][j]=D[i][k]+D[k][j];
                
            
        
    

int main()
    srand((unsigned int)time(NULL));
    N=rand()%10+5;
    G=new bool *[N];
    D=new int *[N];
    for (int i=0;i<N;i++)
    
        G[i]=new bool[N];
        D[i]=new int[N];
        for (int j=0;j<N;j++)
        
            G[i][j]=0;
            D[i][j]=0;
        
    
for (int i=0;i<N;i++)
    
        int n=rand()%N;//顶点i最多和n个顶点连通
        for (int k=0;k<n;k++)
        
            int j=rand()%N;
            G[i][j]=true;
            G[j][i]=true;
        
    
    floyd();

参考技术A #define MAX_DISTANCE 100000
bool** G;//图,G[i][j]=true表示顶点i和j相邻
int N;//图的顶点个数
int **D;//D[i][j]表示点i和点j的距离

void floyd()

//initialize
for (int i=0;i<N;i++)

for (int j=0;j<N;j++)

if (G[i][j])//i和j连通,则他们的距离是1

D[i][j]=1;
D[j][i]=1;
else//否则不可达
D[i][j]=MAX_DISTANCE;




//floyd
for (int k=0;k<N;k++)

for (int i=0;i<N;i++)

for (int j=0;j<N;j++)

if (D[i][j]>D[i][k]+D[k][j])

D[i][j]=D[i][k]+D[k][j];






int main()
srand((unsigned int)time(NULL));
N=rand()%10+5;
G=new bool *[N];
D=new int *[N];
for (int i=0;i<N;i++)

G[i]=new bool[N];
D[i]=new int[N];
for (int j=0;j<N;j++)

G[i][j]=0;
D[i][j]=0;



for (int i=0;i<N;i++)

int n=rand()%N;//顶点i最多和n个顶点连通
for (int k=0;k<n;k++)

int j=rand()%N;
G[i][j]=true;
G[j][i]=true;



floyd();
本回答被提问者采纳

最小生成树

什么时最小生成树?

      一个有n个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个结点,并且有保持图连通的最少的边。最小生成树可以用Kruskal算法或Prim算法求出。

  在一给定的无向图g=(V,E)中,(u,v)代表连接顶点u与顶点v的边,而w(u,v)代表此边的权重,若存在T为E的子集,且为无循环田图,使得w(t)最小,则此T为G的最小生成树。最小生成树其实是最小权重生成树的简称。

最小生成树的应用

  生成树和最小生成树有许多重要的应用。

  例如要在n个城市之间铺设光缆,主要目标是要使这n个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目的是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。

图的入度和出度

1.构建图的邻接矩阵

示例图:

技术图片

根据上面示例图的结构,是顶点与顶点之间的连接关系,又带有权值,所以我们可以用邻接矩阵来表示图中顶点的关系:

技术图片

  • 矩阵中的值代表顶点与顶点之间的权值,由于示例是一个无向图,所以这个矩阵是以对角线对称的
  • 我们可以将矩阵看成一个二维数组,因此可以创建出这个图的数据结构:

 

以上是关于怎样随机生成一个有n个顶点的无向连通图,用C++怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

最小生成树

最小生成树算法(未完成)

图的最小生成树

最小生成树的两种方法(Kruskal算法和Prim算法)

最小生成树

最小生成树