[英]Graph directed and weighted
我有一個加權有向圖,有10個節點,從節點a開始。 節點相互連接(代碼中顯示了特定的連接),邊緣顯示了到達下一個節點的可能性(概率)。 例如,如果節點a連接到節點b和c ,並且兩者都有相同的概率達到(0.5),則應采用列表中的第一個節點,因此這里b 。
然后用戶輸入遍歷函數應通過圖形的次數。 遍歷函數的返回應該是節點e被訪問的次數。
如果您可以幫助我並告訴我如何訪問每個節點並檢查是否為帶有“ e ”的節點,那么我已經做了一些工作,那就太好了。
#include <iosrteam>
#include <cstdlib>
#include <vector>
using namespace std;
struct node {
const char* label;
vector<float> prob;
vector<node*> succ;
};
// TODO: implement function traversal
void node_init(node* a, const char label[]) {
a->label = label;
}
void edge_init(node* a, node* b, float probability) {
a->succ.push_back(b);
a->prob.push_back(probability);
}
void init_graph(node* nodes) {
node_init(nodes, "a");
node_init(nodes+1, "b ");
node_init(nodes+2, "c ");
node_init(nodes+3, "d ");
node_init(nodes+4, "e ");
node_init(nodes+5, "f ");
node_init(nodes+6, "g ");
node_init(nodes+7, "h ");
node_init(nodes+8, "i ");
node_init(nodes+9, "j ");
edge_init(nodes, nodes+1, 0.5);
edge_init(nodes, nodes+2, 0.5);
edge_init(nodes+1, nodes+3, 0.3);
edge_init(nodes+1, nodes+4, 0.3);
edge_init(nodes+1, nodes+5, 0.4);
edge_init(nodes+2, nodes+4, 0.5);
edge_init(nodes+2, nodes+5, 0.5);
edge_init(nodes+3, nodes, 1.0);
edge_init(nodes+4, nodes+6, 0.5);
edge_init(nodes+4, nodes+7, 0.5);
edge_init(nodes+5, nodes+6, 0.25);
edge_init(nodes+5, nodes+7, 0.25);
edge_init(nodes+5, nodes+8, 0.25);
edge_init(nodes+5, nodes+9, 0.25);
edge_init(nodes+6, nodes, 1.0);
edge_init(nodes+7, nodes, 1.0);
edge_init(nodes+8, nodes, 1.0);
edge_init(nodes+9, nodes, 1.0);
}
int main(int argc, char *argv[]) {
if (argc > 1) {
srand(time(0));
node *nodes= new node[12];
init_graph(nodes);
int fische = traversal(nodes,atoi(argv[1]));
cout << endl << "Number of e-access: " << e << endl;
delete [] nodes;
} else {
cout << "Call with number of steps for traversal.\n";
}
return 0;
}
這是我發現的,似乎很有效(我們的老師告訴我們對概率求和並將其與隨機生成的數字進行比較,不要問我為什么):
#include <iostream>
#include <cstdlib>
#include <vector>
#include <time.h>
using namespace std;
struct node {
const char* label;
vector<float> prob;
vector<node*> succ;
};
// TODO: implement function traversal
int traversal(node* start, int argv ){
int e=0;
int i=0;
cout<<start->label<<endl;
if(string(start->label).compare("e ") == 0){
e++;
}
if(argv>0) {
float summe =0;
double ran = (double)rand() / RAND_MAX;
for(int i=0; i<start->prob.size();i++){
summe = summe + start->prob[i];
if(summe>ran){
e =e + traversal(start->succ[i], argv-1);
break;
}
}
}
return e;
}
void node_init(node* a, const char label[]) {
a->label = label;
}
void edge_init(node* a, node* b, float probability) {
a->succ.push_back(b);
a->prob.push_back(probability);
}
void init_graph(node* nodes) {
node_init(nodes, "a ");
node_init(nodes+1, "b ");
node_init(nodes+2, "c ");
node_init(nodes+3, "d ");
node_init(nodes+4, "e ");
node_init(nodes+5, "f ");
node_init(nodes+6, "g ");
node_init(nodes+7, "h ");
node_init(nodes+8, "i ");
node_init(nodes+9, "j ");
edge_init(nodes, nodes+1, 0.5);
edge_init(nodes, nodes+2, 0.5);
edge_init(nodes+1, nodes+3, 0.3);
edge_init(nodes+1, nodes+4, 0.3);
edge_init(nodes+1, nodes+5, 0.4);
edge_init(nodes+2, nodes+4, 0.5);
edge_init(nodes+2, nodes+5, 0.5);
edge_init(nodes+3, nodes, 1.0);
edge_init(nodes+4, nodes+6, 0.5);
edge_init(nodes+4, nodes+7, 0.5);
edge_init(nodes+5, nodes+6, 0.25);
edge_init(nodes+5, nodes+7, 0.25);
edge_init(nodes+5, nodes+8, 0.25);
edge_init(nodes+5, nodes+9, 0.25);
edge_init(nodes+6, nodes, 1.0);
edge_init(nodes+7, nodes, 1.0);
edge_init(nodes+8, nodes, 1.0);
edge_init(nodes+9, nodes, 1.0);
}
int main(int argc, char *argv[]) {
if (argc > 1) {
srand(time(0));
node *nodes= new node[12];
init_graph(nodes);
int e = traversal(nodes,atoi(argv[1]));
cout << endl << "Number of e-access: " << e << endl;
delete [] nodes;
} else {
cout << "Call with number of steps for traversal.\n";
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.