题目链接:http://codeforces.com/problemset/problem/489/D
题意:给出n点,m条有向边,问有多少个如下图的菱形
思路:枚举2点,以及与第一个点的边,若是该边的终点与第二个点相连,则第一个点和第二个点有一条菱形边,算出2点间所有的菱形边则可以求出有多少个菱形,看起来时间复杂度是o(n*n*m)但是用了vecter动态数组,其实就是枚举n个点以及m条边复杂度书o(n*m)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #define maxn 3030 using namespace std; int G[maxn][maxn]; vector <int> link[maxn]; int main() { int n,m; while (scanf("%d%d",&n,&m)!=EOF) { memset(G,0,sizeof(G)); memset(link,0,sizeof(link)); for (int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); G[u][v]=1; link[u].push_back(v); } int res=0; for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) { if (i==j) continue; int sum=0; for (int k=0;k<link[i].size();k++) { int v=link[i][k]; if (G[v][j]==1) sum++; } res+=sum*(sum-1)/2; } } printf("%d\n",res); } }