CodeForces 489D Unbearable Controversy of Being

题意:

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

CodeForces 489D Unbearable Controversy of Being

这四个节点必须直接相邻,菱形之间不区分节点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 }
代码君

 

你可能感兴趣的:(codeforces)