如何从图中随机选取顶点? 我正在寻找用C++从图中随机抽取一个数的方法。br> 例如,我有一个在两个顶点之间添加边(一个或多个)的图形,如何随机选取一个数字? 部分代码:

如何从图中随机选取顶点? 我正在寻找用C++从图中随机抽取一个数的方法。br> 例如,我有一个在两个顶点之间添加边(一个或多个)的图形,如何随机选取一个数字? 部分代码: ,c++,random,graph,C++,Random,Graph,样本输出: 0-10-21-3 使用数学库。兰德函数。选择random num并从边列表中选择(0到边数-1),然后选择另一个随机数并选择边的顶点,0或1(边的底部/顶部顶点)使用数学库。兰德函数。选择random num并从边列表中选择(0到边数-1),然后选择另一个随机数并选择边的顶点,0或1(边的底部/顶部顶点)\include #包括 #包括 #包括 使用名称空间std; //Graph类使用邻接列表表示法表示无向图 类图 { 私人: 顶点的int V;/# list*adj;//指向包


样本输出:

0-1
0-2
1-3


使用数学库。兰德函数。选择random num并从边列表中选择(0到边数-1),然后选择另一个随机数并选择边的顶点,0或1(边的底部/顶部顶点)

使用数学库。兰德函数。选择random num并从边列表中选择(0到边数-1),然后选择另一个随机数并选择边的顶点,0或1(边的底部/顶部顶点)

\include
#包括
#包括
#包括
使用名称空间std;
//Graph类使用邻接列表表示法表示无向图
类图
{
私人:
顶点的int V;/#
list*adj;//指向包含邻接列表的数组的指针
公众:
图(intv)//构造函数
{
这个->V=V;
adj=新列表[V];
}
void addEdge(int v,int w);//向图形添加边的函数
void print(int v,int w);//要显示的函数
};
void图::addEdge(int v,int w)
{
adj[v].向前推(w);//将w添加到v的列表中。
adj[w]。向前推(v);//将v添加到w的列表中。
印刷品(v,w);
}
int-Graph::getRandomVertexFromEdge()
{
int list_size_除以_2=adj.size()/2;
int rEdge=(rand()%列表大小除以2);
int rVW=(rand()%1);
int ret=调整[(红色+rVW)];
//这将从随机边返回一个随机顶点;
打印(红色,rVW);
返回ret;
}
空图::打印(int v,int w){
不能包含
#包括
#包括
#包括
使用名称空间std;
//Graph类使用邻接列表表示法表示无向图
类图
{
私人:
顶点的int V;/#
list*adj;//指向包含邻接列表的数组的指针
公众:
图(intv)//构造函数
{
这个->V=V;
adj=新列表[V];
}
void addEdge(int v,int w);//向图形添加边的函数
void print(int v,int w);//要显示的函数
};
void图::addEdge(int v,int w)
{
adj[v].向前推(w);//将w添加到v的列表中。
adj[w]。向前推(v);//将v添加到w的列表中。
印刷品(v,w);
}
int-Graph::getRandomVertexFromEdge()
{
int list_size_除以_2=adj.size()/2;
int rEdge=(rand()%列表大小除以2);
int rVW=(rand()%1);
int ret=调整[(红色+rVW)];
//这将从随机边返回一个随机顶点;
打印(红色,rVW);
返回ret;
}
空图::打印(int v,int w){


谢谢!你能给我更多提示吗!添加函数ta访问边和边的顶点。然后执行此操作g.getRandEdge().getRandVertex()你将边以成对形式存储在列表中,所以只需执行此操作(列表中的顶点总数/2,取一个介于0和0之间的随机数,然后乘以2,然后添加一个0或1范围内的随机数,以获得vertexThanks!请给我更多提示!添加函数ta访问边和边的顶点。然后执行此操作g.getRandEdge().getRandVertex()您正在列表中以成对形式存储边,因此只需执行以下操作(列表中的顶点总数/2,取一个介于0和0之间的随机数,然后乘以2,然后在0或1范围内添加一个随机数以获得vertexOff主题,但是为什么要对
adj
?为什么不使用
std::vector
std::array
?那么就不需要跟踪使用
V
手动调整大小或手动删除它。@MarkH我正在使用“vector”添加顶点,因此如果有提示如何添加顶点?您将使用
vector
,而不是
vector
。然后,在构造函数中,您将使用
adj=vector(V)
设置向量的大小。最好使用初始值设定项列表:
图形(int V):adj(V){}
。参考:@MarkH如何更改adj[V]。向前推(w)?这一行保持不变。离题,但为什么你要为
adj
使用一个裸露的c样式数组?为什么不使用
std::vector
std::array
?那么你就不需要用
V
手动跟踪大小或手动删除它了。@MarkH我正在使用“vector”添加顶点,所以如果有什么提示,请不要使用
list*adj
,您将使用
vector
。然后,在构造函数中,您将使用
adj=vector(V)
来设置向量的大小。最好使用初始值设定项list:
Graph(int V):adj(V){
。参考:@MarkH如何更改adj[V]。向前推(w)?该行保持不变。@Bsh请查看此未经测试的实现。我现在正在测试,但这里有一些错误(1-int list_size_除以_2=adj.size()/2;我更正为adj[V].size()..)和(2-int ret=adj[(rEdge+rVW)];)无法将列表类型转换为int!正如我所说的,它未经测试并按原样提供,但这只是为了让您理解如何进行转换。同样,我在rand部分之后将rEdge var乘以2,@Bsh请查看这个未经测试的实现。我现在正在测试,但这里有一些错误(1-int list_size_除以_2=adj.size()/2;我更正为adj[V].size()..)和(2-int-ret=adj[(rEdge+rVW)];)无法从列表类型转换为int!正如我所说,它未经测试并按原样提供,但只是为了让您理解如何操作。同样,我在rand部分之后将rEdge var乘以2,
#include <iostream>
#include <list>
#include <queue>

using namespace std;
// Graph class represents a undirected graph using adjacency list representation
class Graph
{
private:
    int V; // # of vertices
    list<int> *adj;  // Pointer to an array containing adjacency lists
public:
    Graph(int V)  // Constructor
    {
        this->V = V;
        adj = new list<int>[V];
    }
    void addEdge(int v, int w); // function to add an edge to graph
    void print(int v, int w); //function to display 
    };

void Graph::addEdge(int v, int w)
{
    adj[v].push_front(w); // Add w to v’s list.
    adj[w].push_front(v); // Add v to w’s list.
    print(v, w);

}

void Graph::print(int v, int w) {
cout << v << " - " << w << endl;}
Graph g(4);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 3);
#include <stdlib.h> 
#include <iostream>
#include <list>
#include <queue>

using namespace std;
// Graph class represents a undirected graph using adjacency list representation
class Graph
{
private:
    int V; // # of vertices
    list<int> *adj;  // Pointer to an array containing adjacency lists
public:
    Graph(int V)  // Constructor
    {
        this->V = V;
        adj = new list<int>[V];
    }
    void addEdge(int v, int w); // function to add an edge to graph
    void print(int v, int w); //function to display 
    };

void Graph::addEdge(int v, int w)
{
    adj[v].push_front(w); // Add w to v’s list.
    adj[w].push_front(v); // Add v to w’s list.
    print(v, w);

}

int Graph::getRandomVertexFromEdge()
{
    int list_size_divided_by_2 = adj.size() / 2;
    int rEdge = (rand() % list_size_divided_by_2);
    int rVW = (rand() % 1);
    int ret = adj[(rEdge + rVW)];
    //this will return a random vertex from a random edge;
    print(rEdge,rVW);
    return ret;
}

void Graph::print(int v, int w) {
cout << v << " - " << w << endl;}