在这里,看了大牛们的代码,学了一个新思路,对于一个三重循环,可以找出他们两两之间有什么关系,用pair,或strcut保存下来,题目里的m是4000,远远小于n,这样会使时间压力减少很多,
62ms
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=5005;
int g[maxn][maxn];
int degree[maxn];
int main(void)
{
int n,m;
scanf("%d%d",&n,&m);
memset(degree,0,sizeof(degree));
memset(g,0,sizeof(g));
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a][b]=1;
g[b][a]=1;
degree[a]++;
degree[b]++;
}
int minn=inf;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(g[i][j])
{
for(int k=j+1;k<=n;k++)
{
if(g[i][k]&&g[j][k])
{
minn=min(minn,degree[i]+degree[j]+degree[k]-6);
}
}
}
}
}
if(minn!=inf)
printf("%d\n",minn);
else printf("-1\n");
return 0;
}
31ms
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> p;
vector<p> v;
const int maxn=5005;
int degree[maxn],g[maxn][maxn];
int main(void)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
v.push_back(make_pair(a,b));
degree[a]++;
degree[b]++;
g[a][b]=g[b][a]=1;
}
int ret=0x3f3f3f3f;
for(int i=0;i<m;i++)
{
int x=v[i].first,y=v[i].second;
for(int j=1;j<=n;j++)
{
if(g[x][j]&&g[y][j])
ret=min(ret,degree[x]+degree[y]+degree[j]-6);
}
}
if(ret==0x3f3f3f3f) printf("-1\n");
else printf("%d\n",ret);
return 0;
}