10000 점의 집합이 있고 서로 랜덤하게 연결되어 있다고 가정합니다. 예를 들어 10 점을 봅시다.비슷한 점의 링크 합계를 계산하십시오.
링크의 같은 번호가 포인트가 유사한 점라고 : 그리고 그들은 picture-처럼 비슷한 점의
정의를 연결. 그림에서 우리
노드 1 노드와 연결되어있는 비칩니다 수있다 [2] 및 [10]
노드 2가 노드에 접속되어 1}, [3], [4], [5], [6] [7], [8]
노드 3은 노드 [2]
노드 (4)에만 노드 [2]
노드 5는 단지 노드와 연결되는 연결되어 접속되어있다 [2]
노드 6은 w i 번째에만 노드는 [2]
노드 7 [2]
노드 8 노드와 연결되어있는 경우에만 노드와 접속되어있다 [2] 및 [9]
기지국 (9)은 노드 [8 접속되어 ]
노드 (10)은 노드에 연결된다 1)
그래서 이들 각각은 하나 개의 링크를 갖기 때문에 정의에 따라, 노드 - 3,4,5,6,7,9,10이 유사 . 다시 Node-1 & 8은 두 개의 링크가 있기 때문에 비슷합니다. 내 문제
는 지금은 비슷한 점의 링크의 합을 계산합니다. 예 :
노드 1은 8과 유사합니다. 노드 (1) 용
: 또한
되고 연결 (7 링크를 가짐) 기지국 (2)에 접속된다
10 노드 (이 1 링크를 가짐)
을 노드 8의 경우 :
노드 2에 연결됩니다. 7 링크)도
및 1 링크가 기지국 9()에 연결되어있다
그래서 링크가 2 군에 대해, 전체 링크의 번호 = 7 + 1 + 7되어야 +1 = 16. 이렇게하면 다른 유사한 점에 대한 전체 링크를 계산하고 싶습니다.
내 코드
여기 내 코드입니다. 그것은 각 포인트에 대한 전체 링크의 결과를 제공합니다. this-
Node 1 is connected with [2]
Node 1 is connected with [10]
For Node: 1 Total links: 2
Node 2 is connected with [1]
Node 2 is connected with [3]
Node 2 is connected with [4]
Node 2 is connected with [5]
Node 2 is connected with [6]
Node 2 is connected with [7]
Node 2 is connected with [8]
For Node: 2 Total links: 7
Node 3 is connected with [2]
For Node: 3 Total links: 1
Node 4 is connected with [2]
For Node: 4 Total links: 1 ... etc
같은 결과를 생성
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
struct Node {
vector<int> links_to;
Node(void){};
Node(int first_link){
links_to.push_back(first_link);
};
};
class Links : public vector<Node> {
public:
void CreateLinks(int n,int m);
void OutputNodes();
};
int RandGenerate(int max) {
return int(drand48()*double(max));
}
void CreateRandom(int *nums,int m,int max) {
bool clear;
for(int i=0;i<m;i++) {
clear=true;
while(clear) {
clear=false;
nums[i]=RandGenerate(max);
for(int j=0;j<i;j++) {
if(nums[i]==nums[j]){
clear=true;break;
}
}
}
}
}
void Links::CreateLinks(int n,int m) {
clear();
for(int i=0;i<m;i++) {
push_back(Node());
}
int edge_targets[m],nums[m];
for(int i=0;i<m;i++) {
edge_targets[i]=i;
}
vector<int> repeated_nodes;
int source=m;
while(source<n) {
push_back(Node());
Node &node=*(end()-1);
for(int i=0;i<m;i++) {
node.links_to.push_back(edge_targets[i]);
at(edge_targets[i]).links_to.push_back(source);
repeated_nodes.push_back(edge_targets[i]);
repeated_nodes.push_back(source);
}
CreateRandom(nums,m,repeated_nodes.size());
for(int i=0;i<m;i++) {
edge_targets[i]=repeated_nodes[nums[i]];
}
source++;
}
}
void Links::OutputNodes() {
for(int i=0;i<size();i++){
cout<<endl;
for(int j=0;j<at(i).links_to.size();j++){
cout<<"Node "<<(i+1)<<" is connected with ["<<(at(i).links_to[j]+1)<<"]"<<endl;
}
cout<<"For Node: "<<(i+1)<<"\t"<<"Total links: "<<at(i).links_to.size()<<endl;
}
}
int main() {
srand48(46574621);
Links network;
network.CreateLinks(10,1); //(nodes,minimum value of link)
network.OutputNodes();
return 0;
}
나는 그 그룹 유사한 점을 수 있도록 기능을 추가 할 각 그룹의 전체 링크의 출력을 제공한다. 어떻게해야합니까?
는 Pixelchemist의 대답에 응답 업데이트
의 내가 this-
1 2
1 10
2 1
2 3
2 4
2 5
2 6
2 7
2 8...etc
같은 파일 이름 "MyLinks.txt"의 데이터를 저장 말할 그리고 파일에서 입력을하자 . 다음은 텍스트 파일에 '연결'의 결과를 저장하고의 값을 얻으려고,
int main (void)
{
ifstream inputFile("MyLinks.txt");
double Temp[2];
Links links_object;
while (true) {
for (unsigned i = 0; i < 2; i++){
inputFile>>Temp[i];
}
for (size_t i(0u); i<10; ++i)
{
links_object.add(Node());
}
links_object.link_nodes(Temp[0], Temp[1]);
/*
links_object.link_nodes(0u, 9u);
links_object.link_nodes(1u, 2u);
links_object.link_nodes(1u, 3u);
links_object.link_nodes(1u, 4u);
links_object.link_nodes(1u, 5u);
links_object.link_nodes(1u, 6u);
links_object.link_nodes(1u, 7u);
links_object.link_nodes(7u, 8u);
*/
}
std::vector<size_t> linksum;
for (auto const & node : links_object.nodes())
{
size_t const linksum_index(node.links().size()-1u);
if (linksum.size() < node.links().size())
{
size_t const nls(node.links().size());
for (size_t i(linksum.size()); i<nls; ++i)
{
linksum.push_back(0u);
}
}
for (auto linked : node.links())
{
linksum[linksum_index] += linked->links().size();
}
}
for (size_t i(0u); i<linksum.size(); ++i)
{
std::cout << "Sum of secondary links with " << i+1;
std::cout << "-link nodes is: " << linksum[i] << std::endl;
}
}
내 코드를 업데이트 날짜 코드 -입니다. 그러나 이제는 세그먼트 분할 오류가 발생합니다. 어떻게 해결할 수 있습니까?
약 10,000 개의 노드를 계산하고 싶습니다.그래서 if 문은 각각 얼마나 많은 링크가 생성되는지를 알 수 없으므로 좋은 생각이 아닙니다. – aries0152