代码随想录-250716-图的读入与构建

图的读入与构建

题目描述:

给定两张有向图 A 和 B,其中图 A 以邻接矩阵形式给出,图 B 以邻接表形式给出。请判断这两张图是否完全一样。我们将"完全一样"的定义为:每个节点的邻居集合完全一致。

输入

输入的第一行包含两个整数 n,表示图的节点数。

接下来的n行,给出图 A 的邻接矩阵。该矩阵的第 i 行第 j 列表示节点 i 和节点 j 之间是否有边。如果存在边,则该位置的值为 1,否则为 0。

接下来的n行,给出图 B 的邻接表。每行第一个数node,后面跟的第一个数k表示接下来输入k个数val表示节点node向这些节点val连一条边

输出

如果图 A 和图 B 完全一样,则输出 "YES";否则输出 "NO"。

注意

  • 图 A 和图 B 是有向图,即如果A[i][j]=1,那么 i 到 j 有条有向边。
  • 节点编号从 1 到 n。
  • 图 A 和图 B 的节点数相同。
  • 数据范围:
    • 1≤n≤10^3
    • 图 A 的邻接矩阵大小为n×n,其中每个元素为 0 或 1。
    • 图 B 的邻接表中每个节点的邻居数量不超过 n−1。

样例输入 1

复制代码
3
0 1 1
1 0 1
1 1 0
1 2 2 3
2 2 1 3
3 2 1 2

样例输出 1

复制代码
YES

Copy

样例输入 2

复制代码
3
0 1 1
1 0 1
1 1 0
1 2 2 3
2 2 1 3
3 1 1 

Copy

样例输出 2

复制代码
NO

Copy

样例2提示

图 �A 的邻接矩阵为:

复制代码
0 1 1
1 0 1
1 1 0

表示图 A 中,节点 11 与节点 22 和节点 33 相连,节点 22 与节点 11 和节点 33 相连,节点 33 与节点 11 和节点 22 相连。

图 B 的邻接表为:

复制代码
1 2 2 3
2 2 1 3
3 1 1

表示图 B 中,节点 11 与节点 22 和节点 33 相连,节点 22 与节点 11 和节点 33 相连,节点 33 与节点 11 相连。

对比可以发现,在图 B 中,节点 33 不连向 节点 22。因此,图 A 和图 B 不完全一样,输出 "NO"。

解答:

考的邻接表和邻接矩阵之间转换。因为是有向图,所以邻接矩阵并不是对称的,如果默认邻接表转换成邻接矩阵会对称就要吃亏了。

这题邻接表转邻接矩阵或者邻接矩阵转邻接表都能做。转邻接矩阵复杂度为O(n^2),转邻接表的代码复杂度是O(n^2log(n))

cpp 复制代码
#include<bits/stdc++.h>
#include <vector>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<vector<int>>mat(n,vector<int>(n,0));
    vector<vector<int>>mat1(n,vector<int>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int t;
            cin>>t;
            mat[i][j]=t;
        }
    }
    for(int i=0;i<n;i++){
        int node,k;
        cin>>node>>k;
        for(int j=0;j<k;j++){
            int t;
            cin>>t;
            mat1[node-1][t-1]=1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(mat[i][j]!=mat1[i][j]){
                cout<<"NO"<<endl;
                return 0;
            }
        }
    }
    cout<<"YES"<<endl;
    return 0;
}
cpp 复制代码
#include<bits/stdc++.h>
#include <ostream>
#include <vector>
using namespace std;
bool check(vector<vector<int>>&m1,vector<vector<int>>&m2){
    int n=m1.size();
    for(int i=0;i<n;i++){
        if(m1[i].size()!=m2[i].size())return 0;
        int l=m1[i].size();
        for(int j=0;j<l;j++){
            if(m1[i][j]!=m2[i][j])return 0;
        }
    }
    return 1;
}
int main(){
    int n;
    cin>>n;
    vector<vector<int>>mat(n);
    vector<vector<int>>mat1(n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int t;
            cin>>t;
            if(t==1)mat[i].push_back(j);
        }
    }
    for(int i=0;i<n;i++){
        int node,k;
        cin>>node>>k;
        for(int j=0;j<k;j++){
            int t;
            cin>>t;
            mat1[node-1].push_back(t-1);
        }
        sort(mat1[node-1].begin(),mat1[node-1].end());
    }
    if(check(mat,mat1))cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}
相关推荐
橘颂TA1 小时前
【数据结构】解锁数据结构:通往高效编程的密钥
数据结构
王哥儿聊AI1 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
手握风云-3 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法3 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董3 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone3 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法
杨小码不BUG4 小时前
CSP-J/S初赛知识点精讲-图论
c++·算法·图论··编码·csp-j/s初赛
LeaderSheepH5 小时前
常见的排序算法
数据结构·算法·排序算法
周杰伦_Jay6 小时前
【图文详解】强化学习核心框架、数学基础、分类、应用场景
人工智能·科技·算法·机器学习·计算机视觉·分类·数据挖掘
violet-lz6 小时前
Linux静态库与共享库(动态库)全面详解:从创建到应用
算法