poj 2117(割点的应用)】的更多相关文章

题目链接: http://poj.org/problem?id=2117 题目大意:在一个非连通图中,求一个切除图中任意一个割点方案,使得图中连通分量数最大. 解题思路: 一个大陷阱,m可以等于0,这时候要特判,结果就是n-1. 同时出题者脑子秀逗了,也不给C的范围.我开了两倍点大小RE了,于是怒开了五倍点大小才A了. 本题不是连通图,需要先计算原始图中的连通分量.方法就是dfs染色. 然后dfs求割点. 之后枚举割点,由于是非连通图,所以连通分量数=原始分量数+block-1. -1的原因是,…
题目链接:http://poj.org/problem?id=2117 思路:题目的意思是要求对于给定的无向图,删除某个顶点后,求最大的连通分量数.显然我们只有删掉割点后,连通分支数才会增加,因此我们可以统计删除某个割点后得到的连通块数,而图中的连通分量数=原图的连通分量数+删除某个割点得到的连通块,这样我们枚举割点,选最大值就可以了. http://paste.ubuntu.com/5969809/…
Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provides electricity. The company owns several power plants, each of them supplying a small area that surrounds it. This organization brings a lot of proble…
http://poj.org/problem?id=2117 题意:求删除图中任意一个顶点后的最大连通分量数. 思路: 求出每个割点对应的连通分量数,注意这道题目中图可能是不连通的. 这道题目我wa了很多发,主要是我忘了根结点的连通分量数得减1. 为什么呢?因为如果我们用cut[]来记录每个结点对应的连通分量数的话,最后的答案还需要加1. 比如2结点,我们计算所得的cut[2]=3,因为它只计算了它的子树的情况,但是父亲结点并没有计算进去,所以最后需要+1,这个1也就是父亲结点方向也会产生一个连…
http://poj.org/problem?id=2117 这个妹妹我竟然到现在才见过,我真是太菜了~~~ 求去掉一个点后图中最多有多少个连通块.(原图可以本身就有多个连通块) 首先设点i去掉后它的子树(我知道不准确但是领会精神就好了吧orz)能分成cut[i]个连通块,那么除了根节点之外去掉任意一个点就多出cut[i]个联通块(根节点多出cut[i]-1个连通块). (简洁的语言说cut[i]表示的就是i点是多少个点双连通分量的割顶,我连割顶都忘了是什么了嘤嘤嘤) 每个点只遍历一次且一定在所…
题目链接:http://poj.org/problem?id=2117 题意:求删除一个点后,图中最多有多少个连通块. 题解:就是找一下割点,根节点的割点删掉后增加son-1(son为子树个数),非根节点删掉之后++ #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 1e4 + 10; const int M = 1e6 + 10; st…
#include<stdio.h> #include<string.h> #define N 11000 /* 去掉一个割点后,询问可以分得的联通图的个数 */ struct node { int u,v,next; }bian[N*100]; /*cut数组记录去掉某个节点后可以增加的联通分支的个数,num数组记录以i为根节点的联通图的元素的个数*/ int head[N],n,yong,cou,index,dfn[N],low[N],cut[N],num[N]; void in…
题目链接:http://poj.org/problem?id=1523 题目大意:连通图,找图中割点,并计算切除该割点后,图中的连通分量个数. 解题思路: POJ的数据很弱. Tarjan法求割点. pre数组,记录这个点的dfs时间位置. 割点的条件是lowv>=pre[u], 即子点比父点先dfs,这时候父点就没有意义了,切掉父点连通分量数肯定会增加. 同时注意特判只有两个点的情况,这时候是不可能出现割点的. 求切除割点后的联通分量数: 从割点出发,把图dfs一遍,如果u=割点,那么对于每个…
题目链接:http://poj.org/problem?id=1144 题意:给出一个无向图,求关键节点的个数. 分析:双连通分量Tarjan算法直接求割点就行了,裸的模板题. AC代码: #include<cstdio> #include<cstring> ; struct EDGE{ int v,next; }edge[N*N]; int first[N],low[N],dfn[N]; bool cut[N]; int rt,son,g,cnt; int min(int a,i…
Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4727   Accepted: 1561 Description Blackouts and Dark Nights (also known as ACM++) is a company that provides electricity. The company owns several power plants, each of them sup…
/* Tarjan求割点 */ #include<iostream> #include<cstdio> #include<cstring> #include<stack> #define maxn 10010 using namespace std; int n,m,num,head[maxn],low[maxn],dfn[maxn],f[maxn],father[maxn]; int point[maxn],topt,sum; struct node{ i…
Description Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a failure of a single node, 3, in the network on the left would prevent some of the still…
题意 :求割点的数量 #include<iostream> #include<stdio.h> #include<vector> #include<string.h> #include<stdlib.h> using namespace std; ; int dfn[maxn], low[maxn]; int cut[maxn]; int n,m,num,sol; vector<int> g[maxn]; void init() {…
Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5620   Accepted: 1838 Description Blackouts and Dark Nights (also known as ACM++) is a company that provides electricity. The company owns several power plants, each of them sup…
题目大意: 求割点: 基本思路: tarjan算法,套板子 代码如下: #include<iostream> #include<string> #include<vector> #include<queue> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int…
题意: 问你这个图中哪个点是割点,如果把这个点去掉会有几个子网 代码: 1 //给你几个点,用着几个点形成了一个图.输入边形成的图,问你这个图中有多少个割点.每一个割点去掉后会形成几个强连通分量 2 //方法: 3 //你可以想用tarjan算法求出来谁是割点.然后每一个割点单独用并查集判断.用所有边(不和这个割点相连的边)通过并查集判断一下 4 //然合并后有几个区域就可以了 5 #include<stdio.h> 6 #include<string.h> 7 #include&…
一.知识目录 字符串处理 ................................................................. 3 1.KMP 算法 ............................................................ 3 2.扩展 KMP ............................................................ 6 3.Manacher 最长回文子串 .......…
Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to N…
题目链接: http://poj.org/problem?id=1144 思路分析:该问题要求求出无向联通图中的割点数目,使用Tarjan算法即可求出无向联通图中的所有的割点,算法复杂度为O(|V| + |E|): 代码如下: #include <cstdio> #include <vector> #include <cstring> #include <iostream> using namespace std; + ; + ; char str[MAX_…
题目链接:http://poj.org/problem?id=1144 描述 一个电话线公司(简称TLC)正在建立一个新的电话线缆网络.他们连接了若干个地点分别从1到N编号.没有两个地点有相同的号码.这些线是双向的并且能使两个地点保持通讯.每个地点的线都终结于电话交换机.每个地点都有一个电话交换机.从每个地点都能通过线缆到达其他任意的地点,然而它并不需要直接连接,它可以通过若干个交换机来到达目的地.有时候某个地点供电出问题时,交换机就会停止工作.TLC的工作人员意识到,除非这个地点是不可达的,否…
poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数 题目大意:如题目所示 给你一些关系图——连通图,想要问你有没有个节点,损坏后,可以生成几个互相独立的网络(也就是连通分量),所以我们利用tarjan算法,求取一个联通分量的点,记录次数,因为访问几次,就代表这个点的不同方向上的联通分量的个数,记录下来,最后输出即可 至于根节点的选取,选谁都没什么问题的,我默认选的节点1 嗯,没什么了,tarjan算法到这算是入门啦 #include <iostream> #includ…
题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点,dfs一次图,求出有几块不连通的子图. AC代码: #include<cstdio> #include<cstring> +; struct EDGE{ int v,next; }edge[N*N/]; int first[N],low[N],dfn[N],cut[N],vis[N]…
http://poj.org/problem?id=1815 题意: 在现代社会,每个人都有自己的朋友.由于每个人都很忙,他们只通过电话联系.你可以假定A可以和B保持联系,当且仅当:①A知道B的电话号码:②A知道C的电话号码,而C能联系上B.如果A知道B的电话号码,则B也知道A的电话号码. 思路:这题是要我们删点,既然是删点,那么就要拆点,容量就是1. 接下来凡是能联系的,就连边,容量为INF,因为我们不是要删除这些边.跑遍最大流就能算出至少要删除多少个点. 这道题的关键是要字典序顺序输出最小割…
http://poj.org/problem?id=1523 太弱... too weak.. 割点我都还要看书和看题解来写..果然是写不出么.. 割点就那样求,然后分量直接这个节点有多少子树就有子树个数+1个分量.还要注意root的特判..sigh..就是崩这里了. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream>…
题目链接:http://poj.org/problem?id=1144 思路:判断一个点是否是割点的两个条件:1.如果一个点v是根结点并且它的子女个数大于等于2,则v是割点.2.如果点v不是根结点,并且存在她的一个子女u,使得low[u]>=dfn[v],则v是割点. http://paste.ubuntu.com/5969610/…
题目地址:id=1144">POJ 1144 求割点.推断一个点是否是割点有两种推断情况: 假设u为割点,当且仅当满足以下的1条 1.假设u为树根,那么u必须有多于1棵子树 2.假设u不为树根.那么(u,v)为树枝边.当Low[v]>=DFN[u]时. 然后依据这两句来找割点就能够了. 代码例如以下: #include <iostream> #include <cstdio> #include <string> #include <cstri…
题目地址:http://poj.org/problem?id=1144 题目:输入一个n,代表有n个节点(如果n==0就结束程序运行). 在当下n的这一组数据,可能会有若干行数据,每行先输入一个节点a, 接下来先输入一个字符,再输入一个数b, 表示a与b是连通的,如果输入的字符是空格就继续本行的输入,如果是'\n',就结束本行的输入.(可以看本题目 最后的提示部分) 建完图后就是进行tarjan的dfs算法了,是割点的标记一下,割边就不用管了. code: #include <iostream>…
poj : http://poj.org/problem?id=1523 如果无向图中一个点 u 为割点 则u 或者是具有两个及以上子女的深度优先生成树的根,或者虽然不是一个根,但是它有一个子女 w, 使得low[w] >= dfn[u]; 其中low[u] 是指点 u 通过回边所能达到的 最小深度优先数,dfn[u]是指 点u 当前所处的 深度优先数: low[u] 是在递归回退时计算出来的,dfn[u] 是在递归时直接计算的. low[u] = min { dfn[u]; min{  low…
给你一些双向边 求有多少个割点 并输出去掉点这个点 去掉后有几个联通分量 Tarjan #include<stdio.h> #include<algorithm> #include<string.h> #include<queue> #include<math.h> using namespace std; #define MAXN 1000 ],dfn[MAXN+],low[MAXN+],z[MAXN+]; int cnt,num; struc…
儿子数大于1的树根或者 Low[v] >= DFN[u]的非树根节点v 就是割点. #include <cstdio> #include <cstring> const int N = 1001; const int M = 1000010; struct Edge { int to,next; bool cut;//是否为桥的标记 }edge[M]; int head[N],tot; int Low[N],DFN[N],Stack[N]; int Index,top; bo…