CF652E Pursuit For Aritifacts
题目传送门 这是一道很好的练习强联通的题目。 首先,从题中可以看到,题目的要求就是要我们求出从起点到终点是否可以经过flag = 1 的边。 由于是无向图,且要求很多,直接暴力dfs会很凌乱。 那么,我们就想到一个思路:能不能尽量把这张图缩小,标记转为点,最好成为一条一条链呢? tarjan的缩点!! 没错,对于一个环,可以想到,只要这个环中有一条边flag = 1,那么所有的点我们都可以通过falg = 1的边到达(因为这是环)。所以,不妨进行tarjan缩点,只要这个缩点中有一条边falg = 1,我们就把这个缩点打上tag。 再一想,经过缩点之后,原来十分凌乱的图就变成了一棵树。到达终点的路线也就只有固定一条了。这里我选择dfs。 思路大体就是这样,总时间复杂度O(M + N) 话不多说,具体细节操作标记在代码里面了。 #include<bits/stdc++.h> using namespace std; #define N 500010 #define isdigit(c) ((c)>='0'&&(c)<='9') inline int read(){ int x = 0,s = 1; char c = getchar(); while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); } while(isdigit(c)