hdu5917
题目
给你一个无向图,问图中有多少个符合条件的集合?条件为这个集合里面存在一个子集(大小>=3)为团或者都是孤立点。答案mod1e9+7
思路
Ramsey定理的通俗表述:
6 个人中至少存在3人相互认识或者相互不认识。
该定理等价于证明这6个顶点的完全图的边,用红、蓝二色任意着色,必然至少存在一个红色边三角形,或蓝色边三角形。
超过6就用定理
3-5就枚举所有情况来判断。
比赛的话还是要猜+找规律
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const ll mod= 1e9+7;
int ma[55][55];
ll fact[55],ans;
int n,m;
vector<int> v;
int ok()
{
int flag=0;
for(unsigned int i=0; i<v.size(); i++)
{
for(unsigned int j=i+1; j<v.size(); j++)
{
for(unsigned int k=j+1; k<v.size(); k++)
{
int a=v[i];
int b=v[j];
int c=v[k];
if(ma[a][b]&&ma[a][c]&&ma[b][c])
{
flag=1;
}
if(!ma[a][b]&&!ma[a][c]&&!ma[b][c])
{
flag=1;
}
if(flag) return 1;
}
if(flag) return 1;
}
if(flag) return 1;
}
return 0;
}
void init()
{
fact[0]=1;
for(int i=1; i<=50; i++) fact[i]=fact[i-1]*i%mod;
}
ll qpow(ll a,ll n)
{
ll ans=1;
while(n)
{
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
ll C(int n,int m)
{
return fact[n]*qpow(fact[m],mod-2)%mod*qpow(fact[n-m],mod-2)%mod;
}
int main()
{
init();
int T,kase=1;
scanf("%d",&T);
while(T--)
{
memset(ma,0,sizeof(ma));
ans=0;
scanf("%d %d",&n,&m);
for(int i=0; i<m; i++)
{
int a,b;
scanf("%d %d",&a,&b);
ma[a][b]=ma[b][a]=1;
}
if(n>=6)
for(int i=6; i<=n; i++)
ans=(ans+C(n,i))%mod;
int flag;
if(n>=3)
{
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
for(int k=j+1; k<=n; k++)
{
v.clear();
v.push_back(i);
v.push_back(j);
v.push_back(k);
if(ok())
{
ans+=1;
ans%=mod;
}
}
}
}
}
if(n>=4)
{
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
for(int k=j+1; k<=n; k++)
{
for(int h=k+1; h<=n; h++)
{
v.clear();
v.push_back(i);
v.push_back(j);
v.push_back(k);
v.push_back(h);
if(ok())
{
ans+=1;
ans%=mod;
}
}
}
}
}
}
if(n>=5)
{
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
for(int k=j+1; k<=n; k++)
{
for(int h=k+1; h<=n; h++)
{
for(int p=h+1; p<=n; p++)
{
v.clear();
v.push_back(i);
v.push_back(j);
v.push_back(k);
v.push_back(h);
v.push_back(p);
if(ok())
{
ans+=1;
ans%=mod;
}
}
}
}
}
}
}
ans%=mod;
printf("Case #%d: %I64d\n",kase++,ans);
}
return 0;
}