TopCoder SRM 566 Div1 250 PenguinSledding

可以发现满足条件的路径只有几种情况:

  1. 一条都不选
  2. 只选一条
  3. 一个点上连若干条边,且边数>=2(就是类似一朵花的形状)
  4. 三条边构成一个环(这种情况很容易漏掉)

分别计算即可。

//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;
}

猜你喜欢

转载自blog.csdn.net/ymzqwq/article/details/81568927
今日推荐