C. 图的顶点可达闭包
题目描述
给定有向图的邻接矩阵A,其元素定义为:若存在顶点i到顶点j的有向边则A[i,j]=1,若没有有向边则A[i,j]=0。试求A的可达闭包矩阵A*,其元素定义为:若存在顶点i到顶点j的有向路径则A*[i,j]=1,若没有有向路径则A*[i,j]=0。
输入
第1行顶点个数n
第2行开始的n行有向图的邻接矩阵,元素之间由空格分开
输出
有向图的可达闭包矩阵A*,元素之间由空格分开
输入样例
4
0 1 0 1
0 0 1 0
0 0 0 0
0 0 0 0
输出样例
0 1 1 1
0 0 1 0
0 0 0 0
0 0 0 0
#include<iostream>
using namespace std;
class Graph{
int vexNum;
int **matrix;
public:
Graph(int n){
vexNum=n;
matrix = new int*[vexNum];
for(int i=0;i<vexNum;i++)
{
matrix[i] = new int[vexNum];
for(int j=0;j<vexNum;j++)
cin>>matrix[i][j];
}
}
~Graph(){
for(int i=0;i<vexNum;i++)
delete []matrix[i];
delete []matrix;
}
void test(){
int flag=1;//成功关键flag
while(flag){
flag=0;
for(int i=0;i<vexNum;i++)
for(int j=0;j<vexNum;j++){
if(matrix[i][j]==1){
for(int k=0;k<vexNum;k++){
if(matrix[j][k]==1&&matrix[i][k]!=1){
matrix[i][k]=1;
flag=1;
}
}
}
}
}
}
void print(){
for(int i=0;i<vexNum;i++)
{
for(int j=0;j<vexNum;j++){
cout<<matrix[i][j];
if(j!=vexNum-1)
cout<<" ";
else
cout<<endl;
}
}
}
};
int main()
{
int n;
while(cin>>n){
Graph myGraph(n);
myGraph.test();
myGraph.print();
}
return 0;
}