题意:给出一个无向无环图,求有多少条长度为3的路径,起点终点可以相同,但是不能再两点之间来回。
分析:乍眼一看是DFS,仔细想一想就会发现,长度为3的路径,也就是说去掉当前扫描的边,我们只要把该边的两个端点他们各自的度数去掉1再相乘,即可得到已该边过渡的所有单向通路,又因为无向,故再乘以2,即可得到所有路。
Code:
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 10000+5;
int du[maxn], u[maxn*10], v[maxn*10];
int main() {
int n, m;
while(~scanf("%d%d", &n, &m)) {
memset(du, 0, sizeof(du));
for(int i = 0; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
u[i] = a, v[i] = b;
du[a]++, du[b]++;
}
int ans = 0;
for(int i = 0; i < m; i++) {
if(du[u[i]] > 1 && du[v[i]] > 1)
ans += (du[u[i]]-1)*(du[v[i]]-1)*2;
}
printf("%d\n", ans);
}
return 0;
}