随笔分类 - 连通度相关
摘要:思路:维护一个森林,二分枚举最小的最大值。#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 20010#define Maxm 40010#define LL long long#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (xdfn[u]){ is[u]=1; ...
阅读全文
摘要:思路:利用它的几条性质#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 20010#define Maxm 2000010#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (xdfn[u]) return 0; low[u]=min(low[u],low[v]); ...
阅读全文
摘要:思路:首先看到这题以为能用poj1904的模版直接A掉,WA了几次,然后又TLE了几次。还是想到了正解。一开始我想的大致方向已经是对的了。先是由王子向每个喜欢的公主建边,再求一次最大匹配,找出匹配后,由匹配的公主向王子建边。但可能会有没有匹配到的公主和王子,那么这个王子可以和任何它喜欢的公主结婚,这个公主也可以和任何喜欢她的王子结婚。因为这些不在匹配中的点,加到匹配中后,减少的匹配数和增加的匹配数都是1。我们也就想像poj1904那样,将他们变为一个强连通分量,我开始出错就在这。直接在原图上将他们建边变为强连通分量会使原图性质发生改变。所有我们对每个没有匹配的公主,建一个虚拟的王子,让他们变成
阅读全文
摘要:思路:先将图进行缩点,建成一颗树,那么如果这是一条单路径树(即最大点度不超过2),就不在能删的一条边,使得不连通。因为将其头尾相连,形成一个圈,那么删任意一条边,图都是连通的。上面的是无解的情况,如果有解,那么这个解一定是树中不全在一条路径上的三条边中的一条,使得这三条边中的最大边最小,即得解。同样,对任意一个节点,其三个子树上的边一定是三条不全在一条路径上的边。问题就转化为求一个节点的第三小边。但直接求第三小边容易出错,并且不易求得。我们可以先选一条树中的最小边,这条边一定是三条边中的一条,我们就沿着这条边的两个端点找。那么问题就又变成了求一个节点的次小边了。这个很容易求得。感谢http:/
阅读全文
摘要:思路:想用Tarjan算法进行缩点,并记录每个连通分支的点数。缩点完毕过后,找出所有出度或入度为0的连通分量,假设该连通分量的点数为num[i],那么ans=Max(ans,(n-num-1)*(n-num)+(num-1)*num+(n-num)*num-m);#include#include#include#include#define Maxn 100010#define Max(a,b) (a)>(b)?(a):(b)using namespace std;int head[Maxn],vi[Maxn],dfn[Maxn],low[Maxn],e,lab,top,Stack[Ma
阅读全文
摘要:思路:先有每个儿子向所有他喜欢的姑娘建边,对于最后给出的正确匹配,我们建由姑娘到相应王子的边。和某个王子在同一强连通分量,且王子喜欢的姑娘都是该王子能娶得。思想类似匈牙利算法求匹配的时候,总能找到增广路径。代码比较烂,跑了近6s。#include#include#include#include#include#include#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a) q[Maxn];void init(){ memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); ...
阅读全文
摘要:思路:将以桥为分界的所有连通分支进行缩点,得到一颗树,求出树的直径。再用树上的点减去直径,再减一#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#define Maxn 210110#define Maxm 2501000using namespace std;int index[Maxn],vi[Maxn],dfn[Maxn],low[Maxn],e,n,lab=0,Stack[Maxn],top,num,head[
阅读全文
摘要:思路:利用dfs遍历整棵树,找出最长子树与次长子树,两者的和最大就是直径。若k值小于直径就输出k-1,否则输出(k-d-1)*2+d;#include#include#include#include#define Maxn 1000010using namespace std;int vi[Maxn],head[Maxn],ans,e;struct Edge{ int u,v,next,val;}edge[Maxn];void init(){ e=0; memset(head,-1,sizeof(head)); ans=0; memset(vi,0,sizeof(...
阅读全文
摘要:思路:每次枚举删除一个点,然后对剩下的点求出关键点,判断删除哪个关键点获得的连通分支数最大。#include#include#include#include#include#include#define Maxn 5100#define Maxm 50100#define inf 0x7fffffffusing namespace std;map p[Maxn];int Index[Maxn],dfn[Maxn],low[Maxn],vi[Maxn],compent[Maxn],e,n,lab,Max=0;struct Edge{ int from,to,next;}edge[Maxm]...
阅读全文
摘要:思路:将所有强连通分支找出来,并进行缩点,然后找其中所有出度为0的连通分支,就是题目要求的。#include#include#include#include#include#define Maxn 5100#define Maxm Maxn*100#define inf 0x7fffffffusing namespace std;int index[Maxn],vi[Maxn],stack[Maxn],dfn[Maxn],low[Maxn],e,n,lab,top,num,list,mark[Maxn],degree[Maxn],be[Maxn];struct Edge{ int fro...
阅读全文
摘要:思路:建图时,分别建正向图edge和转置图T。用正向图edge来DFS,找出第一个被发现的强连通分支(如果该图存在题目要求的点,那么一定就是第一个被发现的)。然后用spfa跑转置图T,判断被发现的点是否可以到达所有点,如可以,就把该连通同的点数输出。否则输出0 。#include#include#include#include#include#define Maxn 10100#define Maxm Maxn*10#define inf 0x7fffffffusing namespace std;int index[Maxn],vi[Maxn],stack[Maxn],dfn[Maxn],l
阅读全文
摘要:思路与poj3177一模一样。#include#include#include#include#include#define Maxn 1010#define Maxm Maxn*Maxn#define inf 0x7fffffffusing namespace std;int dfn[Maxn],low[Maxn],degree[Maxn],e,n,lab,index[Maxn];struct Edge{ int to,from,next,v;}edge[Maxm];void init(){ memset(dfn,0,sizeof(dfn)); memset(low,0,s...
阅读全文
摘要:思路:dfs求出所有点的low值,然后对每个连通分量进行缩点,可以通过low来进行缩点。虽然在同一连通分量里可能存在不同的low值,但这并不影响缩点。将每个连通分量缩为一个点后,只要求出这个缩点后的树上的叶子节点个数就行了。结果为(leaf+1)/2。#include#include#include#include#include#include#define Maxn 1010#define Maxm Maxn*10using namespace std;int index[Maxn],degree[Maxn],dfn[Maxn],low[Maxn],e,n,lab=0,num,visit[
阅读全文
摘要:思路:对于该图,直接用建图貌似没法解,所以也很容易想到建补图,这样存在边的两个点就能再圆桌上做一起。也就将问题转化为对双连通分量中是否存在奇圈了。我们将每次查询的边保存在stack中,当遇到关键点的时候,stack里面保存的就是一个连通分量。在该连通分量中进行深搜,每次标记一个与父节点相反的颜色。当某次子节点与父节点颜色相同,那么就存在奇圈,且该连通分量中所有的点都在奇圈中。将这些点标记,最后进行遍历就行了。引用discuss里的话:一个块若无法做二分图染色,势必存在一个长度为奇数的环任找一个奇环C,则对于任意一个非环上的点A,一定有两条不相交的路,连向这个奇环,交奇环于两个不同的点P、Q(否
阅读全文
摘要:思路:对于所有节点,每次找的子树,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...
阅读全文

浙公网安备 33010602011771号