题目链接
https://ac.nowcoder.com/acm/contest/13493/H
解题思路
1.这题一开始我读题目了,我以为的是把这些点全部连接起来所需要的最小边数;
于是我用了并查集,只过了两个点~
2.后来发现题目是要求找出一个连通块里的任意两点的距离,也就是连通块的最大长度;
这样的话我们就可以用BFS暴力搜索所有节点,找出它们距其他节点的最远距离`的最大值`;
当一次广搜之后仍有节点未被访问的则说明该图不只有一个连通块,输出-1;
代码展示
#include<bits/stdc++.h>
using namespace std;
vector<int>G[2005];
int vis[2005];
int BFS(int x){
memset(vis,0,sizeof(vis));
queue<int>q;
q.push(x);
int ans=0;
while(!q.empty()){
int f=q.front();
q.pop();
ans=max(ans,vis[f]);
for(int i=0;i<G[f].size();i++){
int temp=G[f][i];
if(vis[temp]==0){
vis[temp]=vis[f]+1;
q.push(temp);
}
}
}
return ans;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
}
int ans=0;
bool flag=true;
for(int j=1;j<=n;j++){
ans=max(ans,BFS(j));
for(int i=1;i<=n;i++)
if(vis[i]==0){
flag=false;break;
}
}
if(flag)
cout<<ans<<endl;
else cout<<"-1"<<endl;
return 0;
}
总结
1.一定要认真读题~~~~~;
2.关于求图的最大长度(即任意两点的距离),可以考虑用BFS,因为BFS的层次性;