可以发现满足条件的路径只有几种情况:
- 一条都不选
- 只选一条
- 一个点上连若干条边,且边数>=2(就是类似一朵花的形状)
- 三条边构成一个环(这种情况很容易漏掉)
分别计算即可。
//tc is healthy, just do it
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=51;
int d[N],f[N][N];
ll C[N][N];
class PenguinSledding {
public:
long long countDesigns( int numCheckpoints, vector <int> checkpoint1, vector <int> checkpoint2 );
};
long long PenguinSledding::countDesigns(int n, vector <int> a, vector <int> b) {
for(int i=0;i<=n;i++) C[i][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];
int m=a.size();
for(int i=0;i<m;i++)
d[a[i]]++,d[b[i]]++,f[a[i]][b[i]]=f[b[i]][a[i]]=1;
ll ans=m+1;
for(int i=1;i<=n;i++)
for(int j=2;j<=d[i];j++)
ans=ans+C[d[i]][j];
for(int i=1;i<=n-2;i++)
for(int j=i+1;j<=n-1;j++)
for(int k=j+1;k<=n;k++)
if (f[i][j]&&f[j][k]&&f[k][i]) ans++;
return ans;
}