2.3 KiB
P4214
[CERC2015
] Juice
Junctions
一、题目大意
你被雇佣升级一个旧果汁加工厂的橙汁运输系统。系统有管道和节点构成。每条管道都是双向的,且每条管道的流量都是1
升每秒。管道可能连接节点,每个节点最多可以连接3
条管道。节点的流量是无限的。节点用整数1
到n
来表示。在升级系统之前,你需要对现有系统进行分析。对于两个不同节点s
和t
,s-t
的流量被定义为:当s
为源点,t
为汇点,从s
能流向t
的最大流量。
以下面的第一组样例数据为例,1-6
的流量为3
,1-2
的流量为2
。计算每一对满足a<b
的节点a-b
的流量的和。
输入
第一行包括2
个整数n
和m
(2<=n<=3000,0<=m<=4500
)——节点数和管道数。
接下来m
行,每行包括两个相异整数a,b
(1<=a,b<=n
),表示一条管道连接节点a,b
。
每个节点最多连接3
条管道,每对节点最多被一条管道连接。
输出
输出一个整数——每对满足a<b
的节点a-b
的流量之和。
测试样例
6 8
1 3
2 3
4 1
5 6
2 6
5 1
6 4
5 3
答案
36
翻译一下:
有一张图,每个点至多连三条边,每条边流量上限都是 1
,设f(x,y)
表示 x
到 y
的最大流量,那要你求出 \displaystyle \sum_{x=1}^n \sum_{y=x+1}^n f(x,y)
。
二、题解
因为每个点至多连三条边,所以 f(x,y)
的值只可能是 0,1,2,3
。
如果两点间不连通,那么就是 0
。
如果两点不在一个边双里面但是连通,那么这两点间的路径显然有割点,所以就是 1
。
那么怎么判断 2
和 3
呢?
如果是 2
的话,那么说明两点间只有两条边不重复路径,那么如果删掉路径上的一条边,那么这两个点就不属于同一个边双了。
所以我们可以尝试删掉图中的每一条边,然后每次都求一次边双,假如两个点一直存在于同一个边双,那么就是 3
,否则是 2
。
怎么判断呢?我们可以将一个点呆过的所有边双的编号用哈希压成一个数,然后判断两点的哈希值是否相等即可。