赞
踩
题目
一个完全图,有两种不同的边,求相同三条边的三元环个数
正难反易,完全图一共有 n ∗ ( n − 1 ) ∗ ( n − 2 ) 6 \frac{n*(n-1)*(n-2)}{6} 6n∗(n−1)∗(n−2)个三元环,求出颜色不同的环的个数。遍历点,计算这个点连不同边的个数,两个个数相乘除 2 2 2就是不同环的个数
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<cctype> #include<ctime> #include<iostream> #include<string> #include<map> #include<queue> #include<stack> #include<set> #include<vector> #include<iomanip> #include<list> #include<bitset> #include<sstream> #include<fstream> #include<complex> #include<algorithm> #if __cplusplus >= 201103L #include <unordered_map> #include <unordered_set> #endif #define int long long using namespace std; const int INF = 0x3f3f3f3f; namespace GenHelper { unsigned z1,z2,z3,z4,b,u; unsigned get() { b=((z1<<6)^z1)>>13; z1=((z1&4294967294U)<<18)^b; b=((z2<<2)^z2)>>27; z2=((z2&4294967288U)<<2)^b; b=((z3<<13)^z3)>>21; z3=((z3&4294967280U)<<7)^b; b=((z4<<3)^z4)>>12; z4=((z4&4294967168U)<<13)^b; return (z1^z2^z3^z4); } bool read() { while (!u) u = get(); bool res = u & 1; u >>= 1; return res; } void srand(int x) { z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51; u = 0; } } using namespace GenHelper; bool edge[8005][8005]; int cnt[8010][3]; signed main() { int n, seed; cin >> n >> seed; srand(seed); for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) edge[j][i] = edge[i][j] = read(),cnt[j][edge[i][j]]++,cnt[i][edge[i][j]]++; int ans=0; for(int i=0;i<n;i++){ ans+=cnt[i][0]*cnt[i][1]; } cout<<n*(n-1)*(n-2)/6-ans/2<<endl; return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。