上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 42 下一页
给你一幅图,对于图中的每一条边,判断1、存在于任何一颗最小生成树中 any2、至少存在于某一颗最小生成树中 at least one3、不存在任何一棵最小生成树中 none看见就想一做的图论题思路:至少存在于某一颗最小生成树中 这种情况只可能存在于相同权值的边中,所以每次对于同一权值的边一起处理,再用 最小生成树中克鲁斯卡尔的方法来搞利用并查集:如果某时刻一条边的两个端点在同一集合,如果添加这一条边,就会形成一个环,而环中其他的边都是在上一轮已经添加进去了的(权值都比当前边小)所以当前边是none(一开始初始化为none),如果不在同一集合,标记为at least one,对两个集合建边,建完 Read More
posted @ 2012-03-23 16:02 Because Of You Views(528) Comments(0) Diggs(0)
http://codeforces.com/problemset/problem/118/E给定一幅连通的无向图,输入n、m以及m条边要求给每条边一个方向,即把无向图转换成有向图,然后输出每条边(a b 表示a指向b)要求转换后的图两两间依然可以互相到达。如果不可能,输出0;方法:如果原图中存在割边,输出0;反之,随便从某个点开始dfs,把搜到的边一次输出来就好了因为没有桥,则原图是一个双连通分量,两两间可以互相搜到View Code #include<cstdio>#include<vector>#include<set>#include<cstri Read More
posted @ 2012-03-23 15:44 Because Of You Views(455) Comments(0) Diggs(0)
最大权闭合图的证明:http://www.cnblogs.com/wuyiqi/archive/2012/03/12/2391960.html结论:正的权值的和-建图后的最小割的容量选择了一条边就会选择两个点,边的花费为正,点的花费为负,把边看成点,这个点向两个端点连一条边,表示选择这条边就会选择这两个点然后题目就相当于最大权闭合图的模型了题意:有n个点,m个选择,建造n个点各自需要一定花费,每个选择有一定的获利,会选择两个点,当然也要花费求最大的获利每个选择看成是获利点,每个点看成是花费点,新建源点向获利点建边,权值为获利的大小,花费点向汇点建边,权值为花费的大小每个选择向相应的两个点连一条 Read More
posted @ 2012-03-23 14:35 Because Of You Views(704) Comments(0) Diggs(0)
dp[i][j]表示一边亮i个洞,一边亮j个洞到达成目标还需的天数显然dp[i][j](i>=m,j>=m)=0;dp[i][j]和dp[i+a][j+b]形成递推关系所以需要枚举i,j以及a、b的所有组合数复杂度为O(n^4)注意每个灯亮与不亮都是独立的四个for循环View Code #include<cstdio>#include<cstring>const int maxn = 55 ;double dp[maxn][maxn];double c[maxn][maxn];double mulp[maxn];double mul_p[maxn];dou Read More
posted @ 2012-03-22 19:29 Because Of You Views(580) Comments(0) Diggs(0)
One Person GameTime Limit:1 Second Memory Limit:32768 KB Special JudgeThere is a very simple and interesting one-person game. You have 3 dice, namelyDie1,Die2andDie3.Die1hasK1faces.Die2hasK2faces.Die3hasK3faces. All the dice are fair dice, so the probability of rolling each value, 1 toK1,K2,K3is exa Read More
posted @ 2012-03-21 21:28 Because Of You Views(466) Comments(0) Diggs(0)
题意:一幅图,至多有一个点的度数大于2,,然后有三种操作,给每条边染成黑色或白色,询问两个点间的黑色路径的距离是多少(即两个点有黑色路径相连而成)。找出那个度数大于2的点,没有的话就是一条链。有几个度就有几条链,对于每个操作,找到每个点相应的链,和这个点是这条链上的第几个点,用树状数组做就可以了。考察图的模拟,二维树状数组或线段树学习了别人的代码View Code #include<cstdio>#include<cstring>#include<vector>#include<cstdlib>#include<algorithm>u Read More
posted @ 2012-03-21 13:24 Because Of You Views(399) Comments(0) Diggs(0)
当线段树调试不出来的时候,请画一棵树,设个断点,照着你的树走,走完你就AC了和poj 2528的离散化方法如出一辙,如果两个相邻数的大小大于1 ,在中间插入一个任意的数线段树更新的过程类似于求周长并,需要判断左右边界是否是一样的高度(左儿子的右边界与右儿子的左边界)我是左闭右闭的线段树,所以开始的时候要把n-1加进来(这里错了好几次,一直加了n) ,另外0也要加进来。举个例子:区间长度为10 现在总共记录了1 3 5 7所以要先把0 9 加进来离散化后是0 1 2 3 4 5 6 7 8 9下面这个函数其实是把两个功能结合在一起了View Code void pushup(int rt,int Read More
posted @ 2012-03-19 21:51 Because Of You Views(663) Comments(1) Diggs(1)
转自:http://www.notonlysuccess.com/index.php/segment-tree-complete/题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:这题数据范围很大,直接搞超时+超内存,需要离散化:离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,2000,2012就够了,将其分别映射到0,1,2,3,在于复杂度就大大的降下来了所以离散化要保存所有需 Read More
posted @ 2012-03-19 12:16 Because Of You Views(5511) Comments(0) Diggs(1)
http://www.codeforces.com/problemset/problem/165/E蛮巧妙的,关键是以前做的少,mark一下View Code #include<cstdio>#include<cstring>int f[5000010],a[1000010];int main(){ int n,i,j,k; scanf("%d",&n); memset(f,0,sizeof(f)); for(i=1;i<=n;i++) { scanf("%d",... Read More
posted @ 2012-03-18 01:06 Because Of You Views(401) Comments(0) Diggs(0)
单点更新就好了,简单题一开始以为可以不连续,想来想去都觉得哪里不对劲,感觉无法解决,囧。。。。#define max(a,b) ((a)>(b)?(a):(b)) 要注意加括号,因为没注意这个细节错了蛮久线段树的三个域lm[rt]:从左开始最长的连续递增子序列rm[rt]:以右边界结尾的最长的。。。。mx[rt]:管辖区间内最长的。。。。。如果num[mid]<num[mid+1],可以对区间上的域进行合并还没那个hotel难View Code #include<cstdio>#include<cstring>#include<algorithm> Read More
posted @ 2012-03-17 22:44 Because Of You Views(239) Comments(0) Diggs(0)
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 42 下一页