题解
- 实际上该问题就是求传递闭包
题目
问题 D: 图的顶点可达闭包
时间限制: 1 Sec 内存限制: 128 MB
提交: 545 解决: 270
[提交][状态][讨论版]
题目描述
给定有向图的邻接矩阵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;
int main(void)
{
int i, j, k, vexnum;
cin>>vexnum;
int matrix[vexnum][vexnum];
for(i=0; i<vexnum; i++)
for(j=0; j<vexnum; j++)
cin>>matrix[i][j];
for(k=0; k<vexnum; k++)
for(i=0; i<vexnum; i++)
for(j=0; j<vexnum; j++)
if(matrix[i][k] && matrix[k][j])
matrix[i][j] = 1;
for(i=0; i<vexnum; i++)
for(j=0; j<vexnum; j++)
{
if(j==vexnum-1)
cout<<matrix[i][j]<<endl;
else
cout<<matrix[i][j]<<' ';
}
return 0;
}