Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
TinySTL
提交
d24cfa29
T
TinySTL
项目概览
OpenDocCN
/
TinySTL
通知
4
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TinySTL
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d24cfa29
编写于
2月 11, 2015
作者:
邹
邹晓航
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
bug fix
上级
58f37adf
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
58 addition
and
20 deletion
+58
-20
TinySTL/Detail/Graph.impl.h
TinySTL/Detail/Graph.impl.h
+51
-19
TinySTL/Graph.h
TinySTL/Graph.h
+7
-1
未找到文件。
TinySTL/Detail/Graph.impl.h
浏览文件 @
d24cfa29
...
...
@@ -8,13 +8,14 @@ namespace TinySTL{
return
node_type
(
index
,
val
);
}
template
<
class
Index
,
class
Value
,
class
EqualFunc
>
typename
graph
<
Index
,
Value
,
EqualFunc
>::
node_type
&
typename
const
graph
<
Index
,
Value
,
EqualFunc
>::
node_type
&
graph
<
Index
,
Value
,
EqualFunc
>::
get_node
(
const
Index
&
index
){
for
(
auto
&
pair
:
nodes_
){
if
(
equal_func
(
pair
.
first
.
first
,
index
))
return
pair
.
first
;
}
return
node_type
();
static
node_type
empty_node
;
return
empty_node
;
}
template
<
class
Index
,
class
Value
,
class
EqualFunc
>
bool
graph
<
Index
,
Value
,
EqualFunc
>::
is_contained
(
const
Index
&
index
){
...
...
@@ -78,33 +79,35 @@ namespace TinySTL{
return
adjacent_nodes
(
n
.
first
);
}
template
<
class
Index
,
class
Value
,
class
EqualFunc
>
void
graph
<
Index
,
Value
,
EqualFunc
>::
DFS
(
const
Index
&
index
,
visiter_func_type
func
){
node_type
*
start
=
&
(
get_node
(
index
));
Unordered_set
<
Index
,
std
::
hash
<
Index
>
,
EqualFunc
>
visited
(
7
);
auto
nodes
=
adjacent_nodes
(
start
->
first
);
func
(
*
start
);
visited
.
insert
(
start
->
first
);
for
(
const
auto
&
n
:
nodes
){
void
graph
<
Index
,
Value
,
EqualFunc
>::
_DFS
(
node_type
&
node
,
visiter_func_type
func
,
Unordered_set
<
Index
,
std
::
hash
<
Index
>
,
EqualFunc
>&
visited
){
auto
nodes
=
adjacent_nodes
(
node
.
first
);
func
(
node
);
visited
.
insert
(
node
.
first
);
for
(
auto
&
n
:
nodes
){
if
(
visited
.
count
(
n
.
first
)
==
0
)
//has not visited
DFS
(
n
.
first
,
func
);
_DFS
(
n
,
func
,
visited
);
}
}
template
<
class
Index
,
class
Value
,
class
EqualFunc
>
void
graph
<
Index
,
Value
,
EqualFunc
>::
B
FS
(
const
Index
&
index
,
visiter_func_type
func
){
node_type
*
start
=
&
(
get_node
(
index
));
void
graph
<
Index
,
Value
,
EqualFunc
>::
D
FS
(
const
Index
&
index
,
visiter_func_type
func
){
node_type
start
=
(
get_node
(
index
));
Unordered_set
<
Index
,
std
::
hash
<
Index
>
,
EqualFunc
>
visited
(
7
);
auto
nodes
=
adjacent_nodes
(
start
->
first
);
func
(
*
start
);
visited
.
insert
(
start
->
first
);
_DFS
(
start
,
func
,
visited
);
}
template
<
class
Index
,
class
Value
,
class
EqualFunc
>
void
graph
<
Index
,
Value
,
EqualFunc
>::
_BFS
(
node_type
&
node
,
visiter_func_type
func
,
Unordered_set
<
Index
,
std
::
hash
<
Index
>
,
EqualFunc
>&
visited
){
auto
nodes
=
adjacent_nodes
(
node
.
first
);
func
(
node
);
visited
.
insert
(
node
.
first
);
do
{
nodes_set_type
temp
;
for
(
auto
it
=
nodes
.
begin
();
it
!=
nodes
.
end
();
++
it
){
if
(
visited
.
count
(
it
->
first
)
==
0
){
//has not visited
func
(
*
it
);
visited
.
insert
(
it
->
first
);
auto
s
=
adjacent_nodes
(
it
->
first
);
auto
s
=
adjacent_nodes
(
it
->
first
);
temp
.
insert
(
temp
.
end
(),
s
.
begin
(),
s
.
end
());
}
}
...
...
@@ -112,6 +115,27 @@ namespace TinySTL{
}
while
(
!
nodes
.
empty
());
}
template
<
class
Index
,
class
Value
,
class
EqualFunc
>
void
graph
<
Index
,
Value
,
EqualFunc
>::
BFS
(
const
Index
&
index
,
visiter_func_type
func
){
node_type
start
=
(
get_node
(
index
));
Unordered_set
<
Index
,
std
::
hash
<
Index
>
,
EqualFunc
>
visited
(
7
);
_BFS
(
start
,
func
,
visited
);
//auto nodes = adjacent_nodes(start->first);
//func(*start);
//visited.insert(start->first);
//do{
// nodes_set_type temp;
// for (auto it = nodes.begin(); it != nodes.end(); ++it){
// if (visited.count(it->first) == 0){//has not visited
// func(*it);
// visited.insert(it->first);
// auto s = adjacent_nodes(it->first);
// temp.insert(temp.end(), s.begin(), s.end());
// }
// }
// nodes = temp;
//} while (!nodes.empty());
}
template
<
class
Index
,
class
Value
,
class
EqualFunc
>
string
graph
<
Index
,
Value
,
EqualFunc
>::
to_string
(){
string
str
;
std
::
ostringstream
oss
;
...
...
@@ -120,7 +144,7 @@ namespace TinySTL{
oss
<<
"["
<<
oit
->
first
<<
","
<<
oit
->
second
<<
"]"
<<
":"
;
auto
eit
=
end
(
oit
->
first
);
for
(
auto
iit
=
begin
(
oit
->
first
);
iit
!=
eit
;
++
iit
){
oss
<<
"["
<<
iit
->
first
<<
",
"
<<
iit
->
second
<<
"]"
<<
"->"
;
oss
<<
"["
<<
iit
->
first
<<
","
<<
iit
->
second
<<
"]"
<<
"->"
;
}
oss
<<
"[nil]"
<<
std
::
endl
<<
std
::
setw
(
4
)
<<
"|"
<<
std
::
endl
;
}
...
...
@@ -231,4 +255,12 @@ namespace TinySTL{
void
directed_graph
<
Index
,
Value
,
EqualFunc
>::
delete_node
(
const
node_type
&
item
){
delete_node
(
item
.
first
);
}
template
<
class
Index
,
class
Value
,
class
EqualFunc
>
void
directed_graph
<
Index
,
Value
,
EqualFunc
>::
make_edge
(
const
Index
&
index1
,
const
Index
&
index2
){
auto
node1
=
get_node
(
index1
),
node2
=
get_node
(
index2
);
for
(
auto
it
=
nodes_
.
begin
();
it
!=
nodes_
.
end
();
++
it
){
if
(
equal_func
((
it
->
first
).
first
,
index1
))
(
it
->
second
).
push_front
(
node2
);
}
}
}
\ No newline at end of file
TinySTL/Graph.h
浏览文件 @
d24cfa29
...
...
@@ -41,6 +41,7 @@ namespace TinySTL{
virtual
void
add_node
(
const
node_type
&
item
,
const
nodes_set_type
&
nodes
)
=
0
;
//node of the index must in the graph
virtual
void
add_node
(
const
Index
&
index
,
const
nodes_set_type
&
nodes
)
=
0
;
virtual
void
make_edge
(
const
Index
&
index1
,
const
Index
&
index2
)
=
0
;
virtual
void
delete_node
(
const
node_type
&
item
)
=
0
;
virtual
void
delete_node
(
const
Index
&
index
)
=
0
;
...
...
@@ -49,7 +50,7 @@ namespace TinySTL{
void
BFS
(
const
Index
&
index
,
visiter_func_type
func
);
node_type
make_node
(
const
Index
&
index
,
const
Value
&
val
);
node_type
&
get_node
(
const
Index
&
index
);
const
node_type
&
get_node
(
const
Index
&
index
);
bool
is_contained
(
const
Index
&
index
);
inline
static
nodes_set_type
empty_node_set
();
...
...
@@ -65,6 +66,9 @@ namespace TinySTL{
equal_func_type
get_equal_func
()
const
;
string
to_string
();
protected:
void
_DFS
(
node_type
&
node
,
visiter_func_type
func
,
Unordered_set
<
Index
,
std
::
hash
<
Index
>
,
EqualFunc
>&
visited
);
void
_BFS
(
node_type
&
node
,
visiter_func_type
func
,
Unordered_set
<
Index
,
std
::
hash
<
Index
>
,
EqualFunc
>&
visited
);
protected:
list
<
pair
<
node_type
,
list
<
node_type
>>>
nodes_
;
equal_func_type
equal_func
;
...
...
@@ -138,6 +142,8 @@ namespace TinySTL{
//node n -> every node_type in the nodes set
void
add_node
(
const
node_type
&
n
,
const
nodes_set_type
&
nodes
)
override
final
;
void
add_node
(
const
Index
&
index
,
const
nodes_set_type
&
nodes
)
override
final
;
//node index1 -> node index2
void
make_edge
(
const
Index
&
index1
,
const
Index
&
index2
)
override
final
;
void
delete_node
(
const
node_type
&
item
)
override
final
;
void
delete_node
(
const
Index
&
index
)
override
final
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录