[蓝桥杯 2013 国 AC] 网络寻路
题目描述
X X X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。
源地址和目标地址可以相同,但中间节点必须不同。
如图 1 1 1 所示的网络。
1 → 2 → 3 → 1 1 \to 2 \to 3 \to 1 1→2→3→1 是允许的。
1 → 2 → 1 → 2 1 \to 2 \to 1 \to 2 1→2→1→2 或者 1 → 2 → 3 → 2 1 \to 2 \to 3 \to 2 1→2→3→2 都是非法的。
输入格式
输入数据的第一行为两个整数 N , M N,M N,M,分别表示节点个数和连接线路的条数 ( 1 ≤ N ≤ 10000 , 0 ≤ M ≤ 100000 ) (1 \le N \le 10000,0 \le M \le 100000) (1≤N≤10000,0≤M≤100000)。
接下去有 M M M 行,每行为两个整数 u u u 和 v v v,表示节点 u u u 和 v v v 联通 ( 1 ≤ u , v ≤ N , u ≠ v ) (1 \le u,v \le N,u \neq v) (1≤u,v≤N,u=v)。
输入数据保证任意两点最多只有一条边连接,并且没有自己连自己的边,即不存在重边和自环。
输出格式
输出一个整数,表示满足要求的路径条数。
样例 #1
样例输入 #1
3 3
1 2
2 3
1 3
样例输出 #1
6
样例 #2
样例输入 #2
4 4
1 2
2 3
3 1
1 4
样例输出 #2
10
提示
时限 1 秒,空间限制 64M。蓝桥杯 2013 年第四届国赛
2024/1/28 添加一组 hack 数据
思路
首先,定义一些常量和变量。其中,N
是一个常量,表示最大的节点数量。然后,定义n
和m
两个整数变量,分别表示节点和线路的数量。u[N]
,v[N]
和d[N]
是三个数组,分别存储每条线路的两个节点和每个节点的度数。
接着,初始化d
数组为0,然后读取n
和m
的值。遍历每条线路,读取每条线路的两个节点u[i]
和v[i]
,并更新这两个节点的度数。
定义一个长整型变量ans
为0,用于存储满足条件的路径数量。遍历每条线路,如果线路的两个节点的度数都大于1,那么就计算这两个节点可以形成的路径数量,并加到ans
上。
对于每一条边(连接节点u和节点v)将u
点和v
点作为两个中间节点,选择u节点的其他边(不包括当前边)和v节点的其他边(不包括当前边)来形成新的路径。
u节点和v节点的度数(即与之相连的边的数量)分别为 d [ u [ i ] ] d[u[i]] d[u[i]]和 d [ v [ i ] ] d[v[i]] d[v[i]],但是在计算路径的时候,不能包括当前的边,所以实际可以选择的边的数量就分别为 d [ u [ i ] ] − 1 d[u[i]]-1 d[u[i]]−1和 d [ v [ i ] ] − 1 d[v[i]]-1 d[v[i]]−1。而且,因为每一条边都有两个方向(从u到v和从v到u),所以总的路径数量就是 ( d [ u [ i ] ] − 1 ) ∗ ( d [ v [ i ] ] − 1 ) ∗ 2 (d[u[i]] - 1) * (d[v[i]] - 1) * 2 (d[u[i]]−1)∗(d[v[i]]−1)∗2。
最后,输出ans
的值,表示满足条件的路径数量。
AC代码
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;
const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
int n, m;
int u[N], v[N], d[N];
int main() {
memset(d, 0, sizeof(d));
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d %d", &u[i], &v[i]);
d[u[i]]++;
d[v[i]]++;
}
ll ans = 0;
for (int i = 1; i <= m; i++) {
if (d[u[i]] > 1 && d[v[i]] > 1) {
ans += (d[u[i]] - 1) * (d[v[i]] - 1) * 2;
}
}
printf("%lld\n", ans);
return 0;
}