CodeForces - 574B
思维题
最暴力的想法是直接枚举3个点,这样复杂度为o(n^3),对于4000的数据量肯定会挂掉,所以可以改变一下思路先枚举边,每枚举出一条边就得到了两个点,然后枚举剩下那个点找到度数最小值就行。
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#define inf 1<<29
#define maxn 5000
using namespace std;
struct h{
int l;
int r;
};
int n,m;
h a[maxn];
int d[maxn];
bool mp[maxn][maxn];
int main(){
while(~scanf("%d%d",&n,&m)){
memset(d,0,sizeof(d));
memset(mp,0,sizeof(mp));
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&a[i].l,&a[i].r);
d[a[i].l]++;
d[a[i].r]++;
mp[a[i].l][a[i].r]=mp[a[i].r][a[i].l]=1;
}
int ans=inf;
for(int i=0;i<m;i++){
for(int j=1;j<=n;j++){
if(a[i].l!=j&&a[i].r!=j&&mp[a[i].l][j]==1&&mp[a[i].r][j]==1){
ans=min(ans,d[a[i].l]+d[a[i].r]+d[j]-6);
}
}
}
if(ans==inf)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}