一、DFS 某一点出发开始DFS,到最后,只需要判断最后total的值是否是全部的节点就可以,如果小于总节点数,则证明是不连通的,如果相等,则证明是连通的。 int visited[NUM]; int total = 0; int e[NUM][NUM];//边连接信息,邻接矩阵 void dfs(int i) { int j = 0; visited = 1; total++; for(j=1; j<=n; j++) { if(e[j]==1 && !visited[j])//i和j有关系相邻,并且j顶点没有被访问过 { dfs(j); } } } /*判断图是否连通*/ dfs(1); if(total != n) { /*有节点不能访问*/ cout<<"NO"; }
二、BFS 如果从某一个节点广度搜完,有未访问到的节点,那么该图一定是不连通的。 /*用了广度优先搜索的思想*/ bool BFS(MGraph m) { queue<int> q; bool visa[MAX_VERTEX_NUM];//之前先初始化为false int count=0; memset(visa,0,sizeof(visa));
q.push(1); while(!q.empty()) { int v=q.front(); visa[v]=true; q.pop(); count++; for(int i=1;i<=m.vexnum;i++)//把与v连通并且没有被访问过的结点压进队列里面。 { if(m.arc[v].weight) if(!visa) { q.push(i); visa=true;//标志被访问过。 } } } if(count==m.vexnum)//如果压进栈的结点个数刚好等于总结点的个数,则连通。 return true; return false; }
|