题意:
让你找出,根据所给的图,每4个intersection 组成的菱形一共有几个。
图不一定连通。
思路:
枚举每个节点i,进行dfs,往下搜两步。得到节点i到节点j的走两步方案数有几种。
如果i到j的方案数不小于2,则说明i到j有解。
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 3005;
int n, m;
vector <int> G[MAXN];
int cnt[MAXN];
void dfs(int u, int par, int dep)
{
if(dep == 2)
{
cnt[u]++;
return;
}
for(int i = 0;i < G[u].size(); i++)
{
int v = G[u][i];
if(v == par) continue;
dfs(v, u, dep+1);
}
}
void solve()
{
LL res = 0;
for(int i = 1;i <= n; i++)
{
dfs(i, -1, 0);
for(int j = 1;j <= n; j++)
{
if(cnt[j] >= 2)
{
//cout<<"cnt[j] = "<<cnt[j]<<endl;
res += (LL)cnt[j]*(cnt[j]-1) / 2;
}
cnt[j] = 0;
}
}
cout<<res<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
int u, v;
for(int i = 0;i < m; i++)
{
cin>>u>>v;
G[u].push_back(v);
}
solve();
return 0;
}