图的根节点-数据结构作业。。
2013-06-07 20:46
316 查看
手写邻接表 BFS
#include <iostream> #include <queue> using namespace std; const int maxn = 100000; const int maxm = 300000; struct Graph { int NE , NV; int head[maxn]; struct Node{ int next , v; Node(){} Node(int a,int b):v(a) , next(b){} }E[maxm]; void clear(int n) { NV = n; NE = 0; memset(head,-1,sizeof(int)*n); } inline void Insert(int u,int v) { E[NE] = Node(v , head[u]); head[u] = NE ++; } void Print() { for(int i = 0 ; i < NV ; i ++) { printf("%d:",i); for(int j = head[i]; j != -1; j = E[j].next){ printf(" %d",E[j].v); } puts(""); } } }G; int n, m, ctr; int visit[maxn]; void BFS(int cur) { queue<int> Q; Q.push(cur); visit[cur] = 1; while( !Q.empty() ){ for(int i = G.head[Q.front()]; i != -1; i = G.E[i].next ){ if(!visit[G.E[i].v]){ visit[G.E[i].v] = 1; Q.push(G.E[i].v); ctr++; if(ctr >= n - 1) printf("%d为根节点\n", cur); } } Q.pop(); } } int main(){ cin >> n;//读入顶点数 G.clear(n); cin >> m;//读入边数 int begin, end; for(int i = 0; i < m; ++i) { scanf("%d %d", &begin, &end); G.Insert(begin, end); } //遍历图 输出根节点 for(int i = 0; i < n; ++i){ memset(visit, 0, sizeof(visit)); ctr = 0; BFS(i); } return 0; }
相关文章推荐
- 图的根节点-数据结构作业。。
- 第二次数据结构作业
- 数据结构作业-L1
- 数据结构作业—表达式求值
- Coder Buct 1072: 数据结构作业(可选)-- 约瑟环问题
- 看数据结构写代码(25) 二叉链表 求 宽度,交换左右子树,判断完全二叉树,求节点祖先
- 【数据结构】单链表—求链表中间节点(只遍历一次链表)— 快慢指针
- 数据结构——求邻接矩阵表示的图的关节点
- 数据结构大作业
- The third time:数据结构作业 ___ 二叉查找树
- 数据结构上机【构造哈夫曼树,并输出对应节点的哈夫曼编码】
- 数据结构——2 单链表插入和删除节点
- 数据结构(第二天)单链表的基本操作,创建单链表,头插法,尾插法,删除节点,查询节点
- 数据结构作业
- 数据结构作业——brothers(二叉树)
- 第二次数据结构作业
- 数据结构作业-L2
- 根据父级编号获取无限树结构数据表中所有子节点的数据
- C++实现数据结构作业——表达式求值
- 看数据结构写代码(43) 关节点