摘要:
思路:对于该图,直接用建图貌似没法解,所以也很容易想到建补图,这样存在边的两个点就能再圆桌上做一起。也就将问题转化为对双连通分量中是否存在奇圈了。我们将每次查询的边保存在stack中,当遇到关键点的时候,stack里面保存的就是一个连通分量。在该连通分量中进行深搜,每次标记一个与父节点相反的颜色。当某次子节点与父节点颜色相同,那么就存在奇圈,且该连通分量中所有的点都在奇圈中。将这些点标记,最后进行遍历就行了。引用discuss里的话:一个块若无法做二分图染色,势必存在一个长度为奇数的环任找一个奇环C,则对于任意一个非环上的点A,一定有两条不相交的路,连向这个奇环,交奇环于两个不同的点P、Q(否 阅读全文
摘要:
思路:当a,b的根节点find(a)与find(b)不同时,就直接将这两个数连接起来。由于每个树的根节点的kind值一定为0,所以,对于a,b的kind值相同,我们就讲其中一个根的kind值变为1,当下次再遍历该节点的时候,a与b的kind值就会变得不同。如果a,b的kind值相同,那么就不用变。看代码:#include#include#include#include#define Maxn 20010using namespace std;int set[Maxn],kind[Maxn];int find(int x){ if(x!=set[x]) { int te... 阅读全文
摘要:
思路:对于所有节点,每次找的子树,key[root]++;输出时,对于根节点就输出key[root],对于其它节点i,输出key[i]+1;#include#include#include#include#include#define Maxn 1010#define Maxm Maxn*10#define inf 0x7fffffffusing namespace std;int dfn[Maxn],low[Maxn],index[Maxn],vi[Maxn],n,e,lab,key[Maxn],flag=0;struct Edge{ int to,next,val,from;}edg... 阅读全文
摘要:
看完题目第一遍,感觉很简单。当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了。对于这些无序的点,如果高的在右边,不等式是dis[tall]-dis[short]#include#include#include#include#define Maxn 1010#define inf 0x7fffffff#define Maxm Maxn*Maxnusing namespace std;int dis[Maxn],index[Maxn],vi[Maxn],e,n;struct Edge{ int to,next,va... 阅读全文