第四题:
题意:给定一个无向图,求a->b->c->d(a!=b!=c!=d)的方案数。
首先,我们把这个路径看成a-b-c-d。然后,枚举b-c两条边。然后,设r[i]为点i连接其他点的边数,则总方案数为sum((r[i]-1)*(r[j]-1)|i!=j|)。但是,这并不是最终的结果。我们不能排除情况a-b-c-a。
这时,就可以把b->a,c->a的情况给去掉。
我们以f[i]表示第i个点的情况(也就是输入数据),可以把它当成一个二进制数。
那么,我们就要减去sum(二进制中1的个数(f[i]&f[j])|i!=j|)
这时,可以用bitset来实现这个功能。
程序:
#include <cstdio>
#include <cstring>
#include <bitset>
using namespace std;
#define Maxn 1510
int n;
long long ans;
char s[Maxn];
bitset<Maxn> f[Maxn];
int r[Maxn];
int main()
{
scanf("%d\n",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s);
for(int j=1;j<=n;j++)
{
f[i][j] = s[j-1] - '0';
if(f[i][j]) r[i]++;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(f[i][j])
{
ans += 0LL + (r[i]-1) * (r[j]-1);
ans -= 0LL + (f[i] & f[j]).count();
}
printf("%lld\n",ans);
return 0;
}