题目描述
三人篮球起源于美国街头黑人孩子的三对三斗牛赛,是一项孩子们创造的竞技活动。目前有 n 个球员,其中有 m 对相互认识的关系。一个球员的知名度定义为有多少人和他相互认识。
现在教练需要从这 n 个球员中选出三个人成为一支黑马球队参加比赛,需要球队三人相互认识,但是教练又希望他们三个人的知名度总和加起来最低,到时给大家来一个“一鸣惊人”。
输入
第一行为两个整数 n,m,都不大于 4000。
往后 m 行每一行输入两个不超过 n 的整数 x,y(x < y),表示第 x,y两人互相认识(数据中有可能会有重复的认识关系)。
对于 50% 的数据,满足n,m≤200。
对于 100% 的数据,满足n,m≤40000。
输出
如果能找到三个相互认识的人,你需要输出所有选择中知名度总和的最低值,否则输出 −1。
第二行包括一个数据:图中边的总数。
样例输入 复制
5 6
1 2
1 3
2 3
2 4
3 4
4 5
样例输出 复制
8
AC代码
#include <bits/stdc++.h>
using namespace std;
int v[10000], n, m, ans = 120000, x, y;
bool vis[4005][4005], f;
pair<int, int> a[4005];
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> x >> y;
vis[x][y] = 1;
vis[y][x] = 1;
a[i].first = x;
a[i].second = y;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if ( vis[i][j]) {
v[i]++;
}
}
}
for (int i = 1; i <= m; i++) {
x = a[i].first;
y = a[i].second;
for (int j = 1; j <= n; j++) {
if ( vis[x][j] && vis[y][j]) {
f = 1;
ans = min(ans, v[x] + v[y] + v[j]);
}
}
}
if ( !f ) {
cout << -1;
} else {
cout << ans;
}
return 0;
}