1 条题解
-
0
📝 题目大意
给定一个 个顶点 条边的简单无向图,统计图中三元环(三角形)的数量,即满足 且 、、 之间均有边相连的三元组个数。
💡 解题思路
-
题目分析:,数据规模很小,可以直接暴力枚举所有三元组。 最大为 ,图是简单无向图,没有重边和自环。
-
算法推导:
- 使用邻接矩阵
g[u][v]存储边的关系,方便 查询任意两点是否相连。 - 枚举所有满足 的三元组 ,检查 、、 是否均为
true。 - 每找到一个合法三元组,计数器
ans加一。
- 使用邻接矩阵
-
边界与细节:
- 顶点编号从 开始,矩阵大小开 避免越界。
- 枚举时 从 到 , 从 到 , 从 到 ,严格保证 ,避免重复计数。
- 无向图每条边需双向标记:
g[u][v] = g[v][u] = true。
⏱️ 复杂度分析
- 时间复杂度:,枚举所有三元组需要 次检查, 时约 ,完全可行。
- 空间复杂度:,邻接矩阵存储所有点对关系。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ int N,M; cin>>N>>M; // 邻接矩阵,g[i][j] 表示顶点 i 和 j 之间是否有边 vector<vector<bool>>g(N+1,vector<bool>(N+1,false)); for(int i=0;i<M;i++) { int u,v; cin>>u>>v; g[u][v]=g[v][u]=true; // 无向图,双向标记 } int ans=0; // 三重循环枚举所有满足 a<b<c 的三元组 for(int a=1;a<=N;a++) { for(int b=a+1;b<=N;b++){ for(int c=b+1;c<=N;c++){ // 检查三条边是否都存在(即构成三角形) if(g[a][b]&&g[b][c]&&g[c][a]){ ans++; } } } } cout<<ans<<endl; return 0; } -
- 1
信息
- ID
- 613
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者