Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
东方怂天
DiscreteMathematics
提交
834001d9
D
DiscreteMathematics
项目概览
东方怂天
/
DiscreteMathematics
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
DiscreteMathematics
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
834001d9
编写于
11月 12, 2019
作者:
东方怂天
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update .gitignore
上级
3b380c0f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
0 addition
and
212 deletion
+0
-212
Graph/main.cpp
Graph/main.cpp
+0
-212
未找到文件。
Graph/main.cpp
已删除
100644 → 0
浏览文件 @
3b380c0f
// graphics_judge.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <stdio.h>
#include <string.h>
using
namespace
std
;
#define MAX 100
//邻接矩阵的变量
int
vernum
;
//节点个数
int
graphic
[
MAX
][
MAX
];
int
rech_matrix
[
MAX
][
MAX
];
//可达矩阵
/*初始化矩阵*/
void
init_graphic
();
/*输出有序顶点对,以及每个顶点的入度和出度*/
void
display_degree
();
/*矩阵乘法*/
void
matrix_multi
(
int
A
[][
MAX
],
int
B
[][
MAX
]);
/*求可达矩阵*/
void
rechable_matrix
();
/*判断强连通或则若连通:通过可达矩阵判断,强连通返回0,单向连通返回1,否则返回-1*/
int
judge_connected_graph
();
/*判断是否是弱连通*/
void
judge_connected_weakgraph
();
int
main
()
{
init_graphic
();
display_degree
();
rechable_matrix
();
int
flag
=
judge_connected_graph
();
if
(
flag
==
0
)
{
cout
<<
"输入的图是强连通图"
<<
endl
;
}
else
{
if
(
flag
==
1
)
cout
<<
"输入的图是单向连通图"
<<
endl
;
judge_connected_weakgraph
();
}
return
0
;
}
/*初始化矩阵*/
void
init_graphic
()
{
cout
<<
"请输入图的节点个数:"
;
cin
>>
vernum
;
cout
<<
"请输入一个为"
<<
vernum
<<
"的0,1方正:"
<<
endl
;
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
cin
>>
graphic
[
i
][
j
];
if
(
i
==
j
)
graphic
[
i
][
j
]
=
1
;
}
}
}
/*输出有序顶点对,以及每个顶点的入度和出度*/
void
display_degree
()
{
cout
<<
"输出有序顶点对:"
<<
endl
;
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
if
(
graphic
[
i
][
j
]
!=
0
)
{
cout
<<
"<"
<<
i
<<
","
<<
j
<<
">"
<<
"
\t
"
;
}
}
}
cout
<<
"
\n
每个顶点的入度和出度如下:"
<<
endl
;
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
cout
<<
"第"
<<
i
<<
"个顶点的入度和出度:"
;
int
intoDegree
=
0
;
//入度
int
outDegree
=
0
;
//出度
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
if
(
graphic
[
j
][
i
]
!=
0
&&
i
!=
j
)
intoDegree
++
;
if
(
graphic
[
i
][
j
]
!=
0
&&
i
!=
j
)
outDegree
++
;
}
cout
<<
intoDegree
<<
"
\t
"
<<
outDegree
<<
endl
;
}
}
/*矩阵乘法*/
void
matrix_multi
(
int
A
[][
MAX
],
int
B
[][
MAX
])
{
//乘法的最后结果保存再A矩阵中
int
result
[
MAX
][
MAX
];
memset
(
result
,
0
,
sizeof
(
result
));
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
for
(
int
v
=
0
;
v
<
vernum
;
v
++
)
{
result
[
i
][
j
]
+=
A
[
i
][
v
]
*
B
[
v
][
j
];
}
}
}
//拷贝到A中
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
A
[
i
][
j
]
=
result
[
i
][
j
];
}
}
}
/*求可达矩阵*/
void
rechable_matrix
()
{
int
tmp_matrix
[
MAX
][
MAX
];
//可到达矩阵的每一项比如A^i
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
//主对角线设置为1
graphic
[
i
][
i
]
=
1
;
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
tmp_matrix
[
i
][
j
]
=
graphic
[
i
][
j
];
rech_matrix
[
i
][
j
]
=
graphic
[
i
][
j
];
}
}
for
(
int
i
=
1
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
i
;
j
++
)
{
matrix_multi
(
tmp_matrix
,
graphic
);
}
//相加
for
(
int
m
=
0
;
m
<
vernum
;
m
++
)
{
for
(
int
n
=
0
;
n
<
vernum
;
n
++
)
{
rech_matrix
[
m
][
n
]
=
rech_matrix
[
m
][
n
]
+
tmp_matrix
[
m
][
n
];
}
}
}
cout
<<
"可达矩阵为:"
<<
endl
;
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
if
(
rech_matrix
[
i
][
j
]
!=
0
)
cout
<<
"1"
<<
"
\t
"
;
else
cout
<<
"0"
<<
"
\t
"
;
}
cout
<<
endl
;
}
}
int
judge_connected_graph
()
{
int
flag_connected
=
0
;
//强连通为0,单向连通为1,否则为-1
/*判断强连通和单向连通*/
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
if
(
rech_matrix
[
i
][
j
]
==
0
)
flag_connected
=
1
;
}
}
if
(
flag_connected
==
0
)
return
0
;
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
if
(
rech_matrix
[
i
][
j
]
==
0
&&
rech_matrix
[
j
][
i
]
==
0
)
return
-
1
;
}
}
return
1
;
}
/*判断是否是弱连通*/
void
judge_connected_weakgraph
()
{
for
(
int
i
=
0
;
i
<
vernum
;
i
++
)
{
for
(
int
j
=
0
;
j
<
vernum
;
j
++
)
{
if
(
graphic
[
i
][
j
]
!=
0
)
{
graphic
[
j
][
i
]
=
graphic
[
i
][
j
];
}
}
}
cout
<<
"转化成无向图后的可达矩阵为:"
<<
endl
;
rechable_matrix
();
if
(
judge_connected_graph
()
==
0
)
cout
<<
"可以发现原图是个弱连通图"
<<
endl
;
else
cout
<<
"可以发现原图不是一个弱连通图"
<<
endl
;
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录