/*************************
题意:
与PAT1114类似,都是图的连接问题,求有几个连通图,以及2个点是否同属于一个连通图
************************/
/***********************
解题思路:
用dfs遍历即可, 注意遍历时,给每个点附上一个father赋值,便于确定是否在同一连通图上
*************************/
/***********************
*********************/
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;
#define M 10005
#define INF 0x7ffffff
vector<int> nextNode[M];
int flag[M];
int root;
int father[M];
int birdn = 0;
void dfs(int node){
flag[node] = 2;
birdn ++;
father[node] = root;
int i, e;
for(i=0;i<nextNode[node].size();i++){
e = nextNode[node][i];
if(flag[e] == 1)
dfs(e);
}
}
int main(){
int n, i, m ,k,j,node;
cin>>n;
memset(flag, 0,sizeof(flag));
while(n--){
cin>>m;
if(m != 0){
cin>>node;
flag[node] = 1;
m--;
}
while(m--){
cin>>k;
flag[k] = 1;
nextNode[node].push_back(k);
nextNode[k].push_back(node);
}
}
int treen = 0;
for(i=0;i<M;i++){
if(flag[i] == 1){
treen++;
root = i;
dfs(i);
}
}
printf("%d %d\n", treen, birdn);
cin>>n;
int a,b;
while(n--){
cin>>a>>b;
if(father[a] == father[b]){
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
return 0;
}
PAT1118. Birds in Forest (25) 求连通图数量, 求两点是否在同一连通图内
原创
©著作权归作者所有:来自51CTO博客作者breakDawn的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
java实现管线拓扑关系连通性分析
本文详细介绍了Java实现管线拓扑关系连通性的方法,并给出了详细的代码示例;同时详细介绍了深度优先搜索(DFS)和广度优先搜索(BFS)的联系与区别。
Graph 搜索 深度优先搜索 Java 广度优先搜索 -
PAT 甲级 1118 Birds in Forest
1118 Bi
PAT甲级 Birds in Forest 1118 c代码 #include -
连通图求割点(poj1144)
连
割点 i++ 连通图