提交 8c1f008a 编写于 作者: 东方怂天's avatar 东方怂天

Test

上级
// 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.
先完成此消息的编辑!
想要评论请 注册