题干
根据海绵城市建设指挥部要求,怡山小学将对校内道路进行改造,铺设透水砖。这样有些道路将不能通行。为了不妨碍假期少先队的校内活动安排,大队宣传委员小黄需要知道一些关键的活动地点是否可以到达。
已知校内一共有20处建筑,分别标为1号楼,2号楼,......,20号楼。有些楼之间有道路连接,道路是双向的,如果A楼与B楼间有道路,那么既可以从A楼到B楼,也可以从B楼到A楼。
首先将输入校内的道路数n, 接下来分n行输入各条道路的信息,每行有两个整数(均在1和20之间),代表这两座楼之间有道路连接。 接下来输入查询数m, 然后分m行输入要查询的楼间连路信息,每行有两个整数(均在1和20之间)。
如果两楼之间可以通过一条路径到达(中途有可能经过其它楼),则输出两楼是连接的,否则输出两楼是断开的。
函数接口定义
完成查询两建筑是否连通的函数test
主函数
using namespace std;
const int N=21;
/* 请在这里填写答案 */
int main()
{
int a[N][N]={0}, n, m, i, j, k;
cin>>n;
for(i=0;i<n;i++){
cin>>j>>k;
a[j][k]=a[k][j]=1;
}
cin>>m;
for(i=0;i<m;i++){
cin>>j>>k;
cout<<j<<'-'<<k<<' ';
if(test(a, j, k)) cout<<"connected"<<endl; else cout<<"disconnected"<<endl;
}
return 0;
}
输入
2
1 2
2 3
2
1 3
1 4
输出
1-3 connected
1-4 disconnected
解答
bool test(int a[N][N], int j, int k)//找到一条从j到k的通路,若不存在则返回false
{
//维护一个一维数组,模拟栈的操作,从j开始深搜到一个邻居i且没有搜索过,则将i入栈,如果i==k则搜索成功
//维护一个一维数组,有N个元素,用于记录某个楼是否搜索过
int stack[N+1] = {0}; //存储从j开始走过的路径,如 j m n t,表示从j开始经过m n走到了t
bool visited[N+1] = {false};
int top = 0; //top记录数组stack的最后一个元素的位置,
//首先j入栈
stack[++top] = j;
visited[j] = true;
while(top > 0) //当前栈不空
{
int cur = stack[top--]; //得到当前栈顶
//把与cur连接的所有未访问过的楼号压入栈
for(int i = 0; i < N; i++)
{
if(a[cur][i] == 1 && visited[i] == false)
{
stack[++top] = i;
if(i == k) return true; //访问到k则表示从j到k有通路
visited[i] = true;
}
}
}
return false;
}