CCSP子图计数
Posted _Rikka_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCSP子图计数相关的知识,希望对你有一定的参考价值。
思路: 直接暴力枚举,可以拿到80分。枚举出四个点的所有组合,检查是否满足条件(四个点为CCSP集合)。如果满足再根据入度算出其贡献,该4个点的贡献=入度为三的点个数*(4个点之间的边数-3),所有4个点的组合加起来的贡献即为答案。
至于贡献为啥这样算,拿出笔来再纸上比划两下很容易看出的。
Code:
#include<iostream>
#include<map>
using namespace std;
string str;
int tu[105][105];
map<char, int> ccsp;
int lst[10];
int check()//4个点的贡献
map<int, int> ma;
map<char, int> cc;
int sum = 0;//4个点总的边数
int flag = 0;
for (int i = 1;i <= 4;i++)
cc[str[lst[i]]]++;
for (int j = i + 1;j <= 4;j++)
if (tu[lst[i]][lst[j]])
ma[lst[i]]++;
ma[lst[j]]++;
sum++;
int san = 0;//度为3的点的个数
for (auto i : ma)
if (i.second == 3)
san++;
if (cc != ccsp || san == 0)return 0;
return san * (sum - 3);
int main()
int n, m;
cin >> n >> m;
cin >> str;
str.insert(str.begin(), '%');//单纯占一个位置,让str[1]对应题目给出的字符串
int t = m;
while (t--)
int a, b;
cin >> a >> b;
tu[a][b] = 1;
tu[b][a] = 1;
int ans = 0;
ccsp['C'] += 2;
ccsp['S']++;
ccsp['P']++;
for (int a = 1;a <= n;a++)
for (int b = a + 1;b <= n;b++)
for (int c = b + 1;c <= n;c++)
for (int d = c + 1;d <= n;d++)
lst[1] = a;
lst[2] = b;
lst[3] = c;
lst[4] = d;
ans+=check();
cout << ans;
以上是关于CCSP子图计数的主要内容,如果未能解决你的问题,请参考以下文章