- 博客(21)
- 收藏
- 关注
原创 poj 1144 Network (无向图求割点)
#include#include#includeusing namespace std;vector vec[110];int dfn[110] , low[110],in[110];int n, step , sum ;void init(){ for(int i=0;i<110;i++) { dfn[i]=low[i]=in[i]=0; v
2012-08-31 15:13:55 1199
原创 poj 2117 Electricity (无向图割点去除后最大连通分支数)
题意:求去除一点后,形成的连通分支数的最大值。(使最多的网络不能跟原路线相连)顶点u是割项当且仅满足 (1) 或 (2)时:(1) 若u是树根,且u的孩子数 son>1 。因为没有u的后向边,以这些孩子为根的子树之间互不相连通,所以去掉u后将得到son个分支。(2)若u不是树根,且存在树边 ( u , v ) 使low ( v ) >= dfn ( u )。low值说明
2012-08-29 11:44:39 3257
原创 poj 1523 SPF (无向图 求割项)
题意: 求有多少个割项,且每个割项被几个块所共有。代码:#include#include#include#define mm 1010using namespace std;vector vec[mm];int stack[mm] , low[mm] , dfn[mm] ,gd[mm];int top , step ,n , m ,xx;void init(){
2012-08-27 18:11:11 947
原创 hdu 3394 (无向图求块 判断环)
题意描述: 公园有n个景点,公园的管理员计划要建m条道路,并且安排一些形成回路的参观路径,如果一条道路可以被多条回路共用, 那么这条边是冲突边,如果一个块中有多个环,则该块中的每条边都是冲突边。 如果不能形成环的路则为不需要的边,现在就是求无向图中冲突边和不需要边的条数解题思路: 把图分为多个块,然后判断每个块里面的边数,如果块的边数
2012-08-27 15:56:11 1641
原创 poj 2186 Popular Cows (tarjan + 缩点)
题意 :n头奶牛,m组关系(a b代表a认为b受欢迎)。求最后有多少头奶牛所有奶牛都认为它受欢迎。思路:首先用tarjan算出连通分支数,将所有点都标上所属连通分支color。将每个分支看做一个点,若某点a受到另一点b联系,则说明该点a代表的连通分支中每个原始点都受到b中以及所有认为b受欢迎的点的欢迎,所以此处用dfs计算出每个分支中被多少人欢迎。代码(比较繁琐):#inc
2012-08-25 16:29:46 557
原创 hdu 2767 Proving Equivalences (tarjan + 缩点)
/*题目大意:给定一张有向图,问最少添加几条边使得有向图成为一个强连通图。解题思路:缩点后找入度为0的点和出度为0的点,统计个数,选择大的那个数就是答案。 如果出度为0的个数n比入度为0的个数m多,那添加n条边,从当前出度为0的点到 其他入度为0的点,肯定能成为强连通图,同理可得m大也可以。(各连通分支间 可能需要1条或2条,才能使两个连
2012-08-25 01:33:26 550
原创 hdu 1827 Summer Holiday (Tarjan算法)
#include#includeusing namespace std;int stack[1010],top ,size, step ,color;int in[1010],dfn[1010],low[1010];int rd[1010],price[1010],sum,num;struct E{ int v, next;}e[2010];int head[1010
2012-08-24 16:17:55 709
转载 Tarjan 算法
[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}
2012-08-24 15:54:14 546
原创 coj 1509 Build the given towers
题意:给定一个左视图,要求给定的方块数能否垒成这么一个视图。方块数不要求全部用完。垒数不能超过W。 解答:此题我们采用贪心解决。由于W有限,如果没有黑色的‘b’,我们是可以只用一垒就摆出给定的视图。贪最少的垒,只有到出现奇数个连续的‘b’时,这是我们要将2*1*1的black块挡住一半,使得左视图只看到一个‘b’,这时才要新摆放一个垒。我们从后往前,从高往低摆放视图,至于需要用来作为垫
2012-08-24 09:52:39 602
原创 ccsu 1179 青蛙过河 递推
题目:有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图2—5所示。 n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为: 1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小); (2)青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,
2012-08-17 16:59:01 1946
原创 hdu 1827 Summer Holiday (强连通Kosaraju法)
题意: 输入n、m ,n表示人数和联系对数。联系不同人的花费不同,需要找到花费最少为多少。思路:找到强连通分支(标记同一分支中的点),然后每个分支中最多只需要联系一个人即可,但若两个分支中有联系则只需联系其中一个花费小的,即将每个分支看做一个点,找分支间的出、入度关系。#include#include#define size 1010#define INF 1000000000
2012-08-16 10:48:31 1582
原创 coj 1504 放置棋子(诸侯安置)dp
很久以前,有一个强大的帝国,它的国土成正方形状,如图2—2所示。 这个国家有若干诸侯。由于这些诸侯都曾立下赫赫战功,国王准备给他们每人一块封地(正方形中的一格)。但是,这些诸侯又非常好战,当两个诸侯位于同一行或同一列时,他们就会开战。如下图2—3为n=3时的国土,阴影部分表示诸侯所处的位置。前两幅图中的诸侯可以互相攻击,第三幅则不可以。 国王自然不愿意看到他的诸侯们
2012-08-16 10:20:54 2130
原创 hdu 1811Rank of Tetris (并查集+拓扑排序)
题意: n个队,m种描述(a>b 或 a=b 或 aa同时存在;②:存在环),信息是否不齐全(排名顺序有多种可能:某次入度为0的>1个。)思路: 由于当存在冲突和信息不全时,返回冲突。所以先用并查集将‘=’两边的点“并为一点”,即只用对其中一点进行排序,将他们的根节点赋值为相同。若后面‘>' 或 'a=b与aa同时存在;若该冲突则用拓扑排序将比分顺序排列出来(当排序过程中出现入度为0的个数某次
2012-08-13 15:54:26 924
原创 hdu 1285 确定比赛名次
题意: 拓扑排序,按字典序输出。 #include#include#include#includeusing namespace std;int n,m , top;int vis[510][510];int ans[510];struct E{ int v, next;}e[20010];struct N{ int head , dep ,
2012-08-13 10:52:13 672
原创 hdu 2647 Reward 拓扑排序
#include#include#include#define size 10010using namespace std;int n,m ,top ,ans;struct E{ int v,next;}e[size*2];struct EE{ int dep , rd , head;}node[size];void insert(int u , int v)
2012-08-10 18:03:46 568
原创 2489 Minimal Ratio Tree 最小生成树(选边)
题意: 给n个点及各点间的距离,从中选出m个点 ,使得 边权的和 / 点权的和 最小。思路: 从n个点中选出m个点(枚举每种可能的情况),计算出它的。。。最小值。所以可以用dfs枚举出各种情况,再用prime算出每种情况的。。。最小值。#include#include#define INF 999999using namespace std;int map[20][20
2012-08-10 10:29:04 863
原创 hdu 1997 汉诺塔VII
解题思路: 我们知道递归求汉诺塔步数时,了解首先我们要将A上的1~(n-1)个移到B上,然后将A上的第n大的移到C上,就完成了第一步。然后我们需要将B上的n-1个盘移到C上,可知现在可以将B看做之前的A,A看做B。现在,我们需要判断给出的状态是否为正确的移动(移动步数最短的移法)中的状态。因为递归求步数时,第二步可以实现必须是n已经移动到了C上,若n仍然在A上,则此时要求的就是将A上的
2012-08-08 16:37:58 3426
原创 POJ 1003 判断欧拉回路
题意:有N个房间,每个房间都有若干门通往相应编号的房间(这些开着的门都是由房子主人经过时打开的,所以说明这些房间一定是连通的。),问是否能从编号为M的房间出发,经过所有的房间把所有的门都关闭最后回到0号房间,同时关上的的门不能再被打开。思路:因为各个房间一定是连通的,所以判断是否能够一圈走完所有的路,则以房间为点,门为边的图必定是欧拉回路(有限图G是一条道路(即可以一笔画成)的充分必要条件是G
2012-08-07 16:13:06 4519
原创 BUY LOW, BUT LOWER
“逢低吸纳”是炒股的一条成功秘诀。如果你想成为一个成功的投资者,就要遵守这条秘诀:"逢低吸纳,越低越买"这句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。
2012-08-05 15:26:04 577
原创 ccsu 1090 积最大的整数分解
给你一个正整数N,试将其分解成若干个互不相同的正整数之和,使得这些互不相同的正整数之积最大。//想要积最大,则要保证n分解的数尽量小 #include#include#define size 100010using namespace std;int main(){ int n; int ans[size]; while(scanf("%d",&n)!=EO
2012-08-02 14:36:26 926
原创 hdu 1045Fire Net (建图 、二分匹配)
题意:需要求最大的放置炮台数(每个炮台都不能在其他炮台攻击范围内)。 炮台攻击范围是:该炮台所在的行和列,但是‘X'可以阻挡炮台攻击。思路:二分匹配必须要有两个互不关联的集合,所以可以将行和列看做两个集合,但是’X'可以阻挡攻击,即若一行中有‘X'则该行可能放2个炮台。所以,我们将每行和每列相连的’ . '作为一个点(标号一致),这样按照行或列形成的图中标号的个数即为各
2012-08-02 13:31:39 2865
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人