题目描述:原题链接
小航是计算机系的学生,但他并不喜欢自己的专业。在课余时间,小航喜欢研究社会学的内容,在他经过了多年的研究后,他发现了一个伟大的定理:世界上任意两个人之间最少需要k个友谊纽带就可以全部连接。他需要向世界公布这个研究成果,但是他还没有对这个定理进行验证,由于他急着陪女朋友,所以将验证这个定理的任务交给了他的朋友小杰和小坤。
由于人数太多,而导致任务量非常大,所以小杰和小坤找到了你,请你帮助他们验证这个结论。
输入描述:
第一行包含两个整数n和m,n为总共的人数,m为关系的对数。
接下来m行包含两个整数a和b,表示a和b是朋友关系。
输出描述:
如果n个人当中的某些人无法成为朋友,则输出-1。否则输出一个k,表示最少需要k个纽带就可以连接任意两个朋友(每两个人之间最多有一条纽带)。
示例1
输入
5 4
1 2
2 3
3 4
4 5
输出
4
示例2
输入
复制
5 3
1 2
2 3
3 4
输出
-1
思路:
每个点BFS一遍。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
typedef pair<int,int> PII;
const int N=2010,mod=1e9+7;
int n,m;
int res=-1;
vector<int> v[N];
int st[N];
int bfs(int x)
{
queue<int> q;
int num=0;
q.push(x);
st[x]=0;
while(!q.empty())
{
num++;
int t=q.front();
q.pop();
res=max(res,st[t]);
for(int i=0;i<v[t].size();i++)
{
int k=v[t][i];
if(st[k]==-1)
{
q.push(k);
st[k]=st[t]+1;
}
}
}
return num;
}
int main()
{
cin>>n>>m;
int p;
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
bool flag=true;
for(int i=1;i<=n;i++)
{
memset(st,-1,sizeof st);
int cnt=bfs(i);
if(cnt!=n)
{
flag=false;
break;
}
}
if(!flag) cout<<"-1";
else cout<<res;
return 0;
}