标签:codeforces round #318 div. 2 b - bear and three m acm
<pre name="code" class="cpp">思路:最暴力的想法,用一个三重循环去遍历,这道题给出的时间是2秒,而且cf的服务器肯定很好,所以时间上应该是没有压力的,但我心里一直没底,总感觉会超时。
在这里,看了大牛们的代码,学了一个新思路,对于一个三重循环,可以找出他们两两之间有什么关系,用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; 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; }
版权声明:转载务必请标明出处,谢谢
Codeforces Round #318 (Div. 2)
标签:codeforces round #318 div. 2 b - bear and three m acm
原文地址:http://blog.csdn.net/wyt734933289/article/details/48119969