NC220126. 友谊纽带
描述
输入描述
第一行包含两个整数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
说明:
1号朋友和5号朋友需要最多4个纽带才能连接示例2
输入:
5 3 1 2 2 3 3 4
输出:
-1
说明:
1号朋友和5号朋友无法通过友谊纽带连接C++(clang++11) 解法, 执行用时: 49ms, 内存消耗: 608K, 提交时间: 2021-04-16 17:06:35
#include<bits/stdc++.h> using namespace std; const int maxn=2e3+10; struct node { int x,s; }q[maxn]; bool vis[maxn]; vector <int> v[maxn];int n,m,mx; void bfs(int s) { int l=1,r=1;memset(vis,0,sizeof vis); q[l]=(node){s,0};vis[s]=1; int cnt=0; while(l<=r) { cnt++; for(int y:v[q[l].x]) { if(vis[y]) continue; vis[y]=1; q[++r]=(node){y,q[l].s+1}; mx=max(mx,q[r].s); } l++; } if(cnt!=n) { printf("-1\n"); exit(0); } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int t1,t2; scanf("%d%d",&t1,&t2); v[t1].push_back(t2); v[t2].push_back(t1); } for(int i=1;i<=n;i++) bfs(i); cout<<mx<<endl; }