CodeForces 489D Unbearable Controversy of Being

题意:

给出一个n个节点m条边的有向图,求如图所示的菱形的个数。

这四个节点必须直接相邻,菱形之间不区分节点b、d的个数。

 

分析:

我们枚举每个a和c,然后求出所有满足a邻接t且t邻接c的节点的个数记为r。

那么分别以a、c为左右端点的菱形的个数就是r的二元组合。

 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\n", ans);
40 
41     return 0;
42 }
代码君

 

posted @ 2014-11-18 14:10  AOQNRMGYXLMV  阅读(222)  评论(0编辑  收藏  举报