题意:
给出一个n个节点m条边的有向图,求如图所示的菱形的个数。
这四个节点必须直接相邻,菱形之间不区分节点b、d的个数。
分析:
我们枚举每个a和c,然后求出所有满足a邻接t且t邻接c的节点的个数记为r。
那么分别以a、c为左右端点的菱形的个数就是r的二元组合。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <vector> 3 4 using namespace std; 5 6 const int maxn = 3000 + 10; 7 bool G[maxn][maxn]; 8 vector<int> nxt[maxn]; 9 10 int main() 11 { 12 //freopen("in.txt", "r", stdin); 13 int n, m; 14 scanf("%d%d", &n, &m); 15 for(int i = 0; i < m; ++i) 16 { 17 int a, b; 18 scanf("%d%d", &a, &b); 19 G[a][b] = true; 20 nxt[a].push_back(b); 21 } 22 23 int ans = 0; 24 for(int a = 1; a <= n; ++a) 25 for(int c = 1; c <= n; ++c) 26 { 27 if(a != c) 28 { 29 int r = 0; 30 for(int b = 0; b < nxt[a].size(); ++b) 31 { 32 if(nxt[a][b] != a && nxt[a][b] != c && G[nxt[a][b]][c]) 33 r++; 34 } 35 ans += r*(r-1)/2; 36 } 37 } 38 39 printf("%d ", ans); 40 41 return 0; 42 }