题目链接:点击这里
题意:给出一个图,求稳定子图的个数。稳定子图定义为包含三元环子图或者三个点独立集子图的图。
直接特判3,4,5个点的子图。大于等于6个点的子图都符合。
现场赛的时候读懂题目马上就觉得当子图的点很多的时候必然是稳定子图。然后枚举了一下所有的五元图,发现五个点以上就是稳定子图(然后智障的连五元环这个反例也没发现)。结果一直wa到死,就这样和金牌擦肩而过T.T。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define maxn 55
#define mod 1000000007
int w[maxn][maxn];
int n, m;
long long qpow (long long a, long long b) {
if (b == 0) return 1;
long long ans = qpow (a, b>>1);
ans = ans*ans % mod;
if (b&1) ans = ans*a % mod;
return ans;
}
bool ok (int i, int j, int k) {
if (w[i][j]+w[i][k]+w[j][k] == 0) return 1;
if (w[i][j]+w[i][k]+w[j][k] == 3) return 1;
return 0;
}
bool ok (int i, int j, int k, int l) {
if (ok (i, j, k) || ok (i, j, l) || ok (j, k, l) || ok (i, k, l)) return 1;
return 0;
}
bool ok (int i, int j, int k, int l, int p) {
if (ok (i, j, k, l) || ok (i, j, k, p) || ok (i, j, l, p) ||
ok (i, k, l, p) || ok (j, k, l, p)) return 1;
return 0;
}
int main () {
int t, kase = 0;
cin >> t;
while (t--) {
cin >> n >> m;
memset (w, 0, sizeof w);
for (int i = 0; i < m; i++) {
int u, v;
scanf ("%d%d", &u, &v);
w[u][v] = w[v][u] = 1;
}
long long ans = qpow (2, n);
ans = (ans-1+mod)%mod;
ans = (ans-n+mod)%mod;
ans = (ans-n*(n-1)/2+mod)%mod;
for (int i = 1; i <= n; i++) {
for (int j = i+1; j <= n; j++) {
for (int k = j+1; k <= n; k++) {
if (!ok (i, j, k)) ans = (ans-1+mod)%mod;
}
}
}
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 l = k+1; l <= n; l++) {
if (!ok (i, j, k, l))
ans = (ans-1+mod)%mod;
}
}
}
}
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 l = k+1; l <= n; l++) {
for (int p = l+1; p <= n; p++) {
if (!ok (i, j, k, l, p))
ans = (ans-1+mod)%mod;
}
}
}
}
}
printf ("Case #%d: %lld\n", ++kase, ans);
}
return 0;
}