0%

CF-1021-D. Baggage Claim

思路讲解

无向图边的重定向问题。

只告诉你奇数的块的位置,不告诉你偶数的块的位置,问有多少条路径(取模mod)

image

其实比较难的就是想样例4,多个块共用一个块,这个时候怎么办?

image

把他转化为图论问题,其实就是问这张图上有多少条 151→5 路径?

这个有几种路径怎么算那?这其实根本用不到什么最小割,最大流什么的,割是用来解决不相交路径数量问题的。直接上dfs就行。

唉,这个直接暴力会TLE,毕竟数量太多了,一个一个统计一定会TLE的。

https://www.luogu.com.cn/problem/solution/CF2097B

其实想到见图了可以更进一步,直接将约束和点抽象为图。

image

主要就是把这个问题转化为了无向图方向确定问题。

AC代码

https://codeforces.com/contest/2097/submission/318339701

心路历程(WA,TLE,MLE……)

TLE

毕竟我的算法是去试每一条路径

https://codeforces.com/contest/2098/submission/317475573

调试中一个样例出的一些问题

通过暴力程序dfs我们得知,这个点直到(2,3)点,仍然有11条路径
但到了(1,4)点,我们就只有2条路径了。
因为有一个始源路径就是(2,5)->(3,3)->(3,4),(2,3)->(1,4)也需要
所以说问题出在passNum的统计上,(3,3)作为始祖路径之一,早已不是只有一条路径通过了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
inline void merge(ll x,ll y){
ll fax=find(x),fay=find(y);
if(x==y) {
// 增加了一个自环,也算是加了
rEdge[fax]+=1;
selfLoop[fax]=true;
#ifdef LOCAL
cerr << "--------selfLoop-----" << '\n';
#endif
return;
}else if(fax==fay){ // 这段斜体加粗要加上用来特判即不是自环,但在同一联通块的情况
rEdge[fay]+=1;
return;
}
rNode[fay]+=rNode[fax];
rEdge[fay]+=rEdge[fax]+1;
selfLoop[fay]|=selfLoop[fax];
fa[fax]=fay;
}