感想:无向图!!不是有向图,我被坑了两个小时
DFS+并查集
#include<iostream>
#include<vector>
#include<map>
#include<deque>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int N,ans2=0;
int ma[1010][1010];
int b[1010];
int isread[1010]={0};
deque<int> q;
int find(int i){
if(b[i]==0)
return i;
return b[i]=find(b[i]);
}
int BFS(int i){
int MM=1,x,j;
for(j=0;j<=N;j++)
isread[j]=0;
q.push_back(i);
isread[i]=1;
while(!q.empty()){
x=q.front();
q.pop_front();
for(j=0;j<ma[x][1005];j++){
if(isread[ma[x][j]]==0){
q.push_back(ma[x][j]);
isread[ma[x][j]]=isread[x]+1;
}
}
}
for(j=1;j<=N;j++){
if(isread[j]>MM)
MM=isread[j];
}
return MM;
}
void unino(int i,int j){
if(find(i)!=find(j))
b[find(i)]=find(j);
}
int main(){
int i,j,temp,ans1=0,K;
cin>>N;
for(i=0;i<1010;i++){
b[i]=0;
for(j=0;j<1010;j++)
ma[i][j]=0;
}
for(i=1;i<=N;i++){
cin>>K;
for(j=0;j<K;j++){
cin>>temp;
unino(i,temp);
ma[i][ma[i][1005]++]=temp;
ma[temp][ma[temp][1005]++]=i;
}
}
for(i=1;i<=N;i++){
ans2=max(ans2,BFS(i));
if(b[i]==0)
ans1++;
}
cout<<ans1<<" "<<max(ans2-2,0)<<endl;
}