怎样随机生成一个有n个顶点的无向连通图,用C++怎么写?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样随机生成一个有n个顶点的无向连通图,用C++怎么写?相关的知识,希望对你有一定的参考价值。
可以的话 再顺便问下 求其中两个点的最短路径用C++怎么写?
1、使用随机函数rand生成随机数即可。
2、例程:
#define MAX_DISTANCE 100000bool** 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++怎么写?的主要内容,如果未能解决你的问题,请参考以下文章