-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkcore.cpp
More file actions
87 lines (85 loc) · 2.12 KB
/
kcore.cpp
File metadata and controls
87 lines (85 loc) · 2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
*description : a naive kcore implementations
*assign degree to vertex data
*iteratte vertex
* for v in V
* if 0 < v.data < k
* v.data = -1
* for vv in v.neighbor
* vv.data--
* when not exist v that 0 < data <k
* break
*
**/
#include"graph.hpp"
#include<cstdlib>
#include<iostream>
#include<vector>
#include<string>
#include<map>
int main(int argc, char const *argv[])
{
std::string fname = "data/out.txt";
Graph<int,int> g;
if( not g.load(fname))
{
std::cout<<"load error\n";
return 1;
}
g.finalized();
for(size_t i = 0; i < g.num_vertices(); i++)
{
g.vertices[i]=g.in_edges(i).size()+g.out_edges(i).size();
}
size_t sum = 0;
for(auto& e : g.vertices)
{
std::cout<<e<<"\t";
sum += e;
}
std::cout<<sum/2<<std::endl;
std::cout<<g.num_vertices()<<"\t"<<g.num_edges()<<std::endl;
int k = 4;
bool breakflag;
while(true)
{
breakflag=true;
for(size_t i = 0; i < g.num_vertices(); i++)
{
if( g.vertices[i] > 0)
{
if( g.vertices[i] < k)
{
for(auto e: g.in_edges(i))
{
vid_type s = e.first;
eid_type eid = e.second;
g.vertices[s]--;
g.edge_buffer.edata[eid]=-1;
}
for(auto e: g.out_edges(i))
{
vid_type t = e.first;
eid_type eid = e.second;
g.vertices[t]--;
g.edge_buffer.edata[eid]=-1;
}
g.vertices[i]=-1;
breakflag=false;
}
}
}
if(breakflag)break;
}
size_t cnt = 0;
for(size_t i = 0; i < g.num_edges(); i++)
{
if( g.edge_buffer.edata[i] != -1)
{
std::cout<<g.edge_buffer.source[i]<<", "<<g.edge_buffer.target[i]<<"\n";
cnt++;
}
}
std::cout<<cnt<<std::endl;
return 0;
}