图的连通分量(利用邻接表存储信息)
2020-04-26 19:07
1006 查看
用vector实现邻接表
vector <int> G[100]; //表示有100个顶点的图的邻接表
G[u].push_back(v); //从顶点u 向顶点v 画边,即在相当于创建一个二维数组G[100][i]
//搜索与顶点u 相邻的顶点v
for( int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
.......
}
邻接表表示法的优点
只需与边数成正比的内存空间
邻接表表示法的缺点
(1)设u 的相邻顶点数量为n,那么在调查顶点u 与顶点v 的关系时,需要消耗O(n)来搜索邻接表。
(2)难以有效的删除边
#include<iostream> #include<vector> #include<stack> using namespace std; static const int MAX = 100000; static const int NIL = -1; int n; vector <int> G[MAX]; int color[MAX]; //深度优先遍历 void dfs(int r, int c) { stack <int> S; S.push(r); color[r] = c; while( !S.empty() ) { int u = S.top(); S.pop(); for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(color[v] == NIL) { color[v] = c; S.push(v); } } } } void assignColor() { int id = 1; //设置初始值 for( int i = 0; i < n; i++ ) color[i] = NIL; //以未访问的u为起点进行深度优先搜索 for( int u = 0; u < n; u++ ) { if( color[u] == NIL ) dfs(u, id++); } } int main() { int s, t, m, q; // n为用户数(顶点数), m 为关系个数 cin >> n >> m; //建立邻接表 for(int i = 0; i < m; i++) { cin >> s >> t; G[s].push_back(t); G[t].push_back(s); } //深度优先遍历,将可以连通的顶点的color设置成同一值 assignColor(); cin >> q; for(int i = 0; i < q; i++) { cin >> s >> t; if( color[s] == color[t] ) { cout << "yes" << endl; } else { cout << "no" << endl; } } return 0; } /* 10 9 0 1 0 2 3 4 5 7 5 6 6 7 6 8 7 8 8 9 3 0 1 5 9 1 3 */
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- JAVA实践图的存储结构---邻接表(利用链表)
- 利用集合完成象数据库那样存储数据,并且可以简单查询,利用map存储学生信息
- 利用Beautifulsoup+Xpath爬取安居客官网全国600多城市二手房信息并存储mongodb
- 利用html5的本地存储功能实现登录用户信息保存
- 利用jws发布一个查询员工信息的Web服务(员工信息存储在数据库中)
- 【PM复习】利用存储信息建立页表
- 利用链表来实现对员工信息的存储,排序,删除,插入
- 使用数组来模拟邻接表存储图信息
- 利用html5的本地存储功能实现登录用户信息保存
- 利用ElasticSearch和Redis检索和存储十亿信息
- 利用Cookie变量来存储信息和服务器页面
- C++ 利用类的静态成员特性定义全局变量来存储信息
- asp.net 利用cookie存储信息。刚刚入门就写了一个方法感觉还蛮好用
- 利用接口 股票数据信息的爬取和存储
- SQL SERVER 利用存储过程查看角色和用户信息的写法
- 利用邻接表存储无向非连通图并利用DFS和BFS遍历图的邻接表|Zam9036博客
- 利用WSS做后台存储--设计一个统一的信息发布平台
- 利用WSS做后台存储--设计一个统一的信息发布平台
- 利用ElasticSearch和Redis检索和存储十亿信息
- 登录注册系统(servlet实现,利用文本存储注册信息)--超详细(一)