根据复杂度无法枚举3个点,所以可以枚举边,变为O(N*M)的复杂度可以通过
我们可以利用一个g数组记录那两个点之间有边,然后枚举第三个点,用一个d数组记录每个点的度,最后求出一个环所连的边的点最少,只需要cnt=d[a]+d[b]+d[c]-6计算即可。
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define x first
#define y second
typedef pair<int,int> PII;
const int N=4e3+10;
int n,m,k,ans,ecnt;
struct edge {
int u,v;
} E[N<<1];
int d[N],g[N][N];
int main() {
cin>>n>>m;
for(int i=0; i<m; i++) {
int a,b;
cin>>a>>b;
g[a][b]=g[b][a]=1;
d[a]++,d[b]++;
E[++ecnt].u=a,E[ecnt].v=b;
}
int res=-1;
for(int i=0; i<m; i++) { //根据复杂度判断是枚举边
int a=E[i].u,b=E[i].v;
for(int c=1; c<=n; c++) { //枚举点
if(g[a][c]&&g[b][c]) { //存在环
int cnt=d[a]+d[b]+d[c]-6;//根据题意判断减6因为双向边
if(res==-1||res>cnt)res=cnt;
}
}
}
cout<<res;
return 0;
}