warshall
BFS——队列
DFS——递归+驱动
#include<iostream>
#include<queue>
#include <>
#include<>
using namespace std;
#define MAXN 1000
#define INF 0x3f3f3f3f
int a[MAXN][MAXN];
int n; // 节点个数 0~n-1
int tmp[MAXN][MAXN];
bool vis[MAXN]; // 访问数组
//输入
void input()
{
memset(a, INF, sizeof(a)); // important
//输入a数组
//...
//初始化tmp数组
memset(tmp, 0, sizeof(tmp));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j] < INF) // INF代表不通
tmp[i][j] = tmp[j][i] = 1;
else
tmp[i][j] = tmp[j][i] = 0;
}
tmp[i][i] = 1;
}
}
//warshall算法判断图的连通性
bool Warshall()
{
/*
memset(tmp, 0, sizeof(tmp));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j] < INF) // INF代表不通
tmp[i][j] = tmp[j][i] = 1;
else
tmp[i][j] = tmp[j][i] = 0;
}
tmp[i][i] = 1;
}
*/
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(tmp[i][j])
{
for(int k=0;k<n;k++)
{
if(tmp[k][i])
tmp[k][j] = tmp[j][k] = 1;
}
}
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(!tmp[i][j])
return false;
return true;
}
//广度优先搜索判断连通性
bool BFS()
{
/*
memset(tmp, 0, sizeof(tmp));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j] < INF) // INF代表不通
tmp[i][j] = tmp[j][i] = 1;
else
tmp[i][j] = tmp[j][i] = 0;
}
tmp[i][i] = 1;
}
*/
queue<int> q;
int count = 0;
memset(vis, 0, sizeof(vis)); // 初始化
(0); //0节点入队列
while(!())
{
int v = ();
vis[v] = true;
();
count++;
//与联通且没有被访问过节点入队列
for (int i=0;i<n;i++)
{
if (tmp[v][i])
{
if(!vis[i])
(i);
}
}
}
if (count == n) return true; // count <= n ???
else return false;
}
//深度优先搜索判断图的连通性——需要驱动:),tmp数组需要先初始化。
void DFS(int firstNode)
{
vis[firstNode] = true; // need将vis定义为全局变量
for(int i=0;i<n;i++)
{
if(tmp[firstNode][i] && !vis[i])
DFS(i);
}
}
//DFS驱动
bool driverDFS()
{
memset(vis, 0, sizeof(vis));
DFS(0); // 从0节点开始访问
for(int i=0;i<n;i++)
{
if (vis[i] == false) return false;
}
return true;
}