摘要:题目要求割顶集,并且还要求出去掉割顶之后剩下的图连通数目。tarjan算法求出割顶后直接枚举就可以了吧。一开始想到利用iscut[u]的次数也就是点u被判定为割顶的次数求连通分量数,还有利用与结点u相连的点的bccno不同的编号来判定,都是不行的,具体原因自己想清楚比较好。以后就不会犯这样的错误了。代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #define esp 1e-6#define pi aco
阅读全文
摘要:给定一个无向的连通图,要求每个点去掉后连通分量的数目,然后输出连通分量最多的m个点。 分析: 先求出双连通分量,然后统计所有双连通分量中割顶出现的次数,最后求出的就是割顶去掉后剩下的双连通的数目,对于不是割顶的点,去掉后剩下的仍为双连通,所以结果就是1. 代码: #include #include #include #include #include #include #inc...
阅读全文
摘要:给n对夫妇安排座位,其中0h,0w分别表示新郎,新娘。同一对新郎,新娘不能坐在同一侧,而且互为通奸关系的人不能同时坐在新娘对面。 这道题目真是掉尽节操啊,,,欧美的氛围还是比较开放的。 分析: 首先说一下应该注意的是新郎新娘也可能是会有通奸关系出现的,所以一开始必须将他们考虑进去。 为每对夫妇设立一个变量,xi,1表示妻子和新娘坐在同侧,否则表示丈夫和新郎坐在同侧。然后用mark[2*i]...
阅读全文
摘要:注意数组别开太小了,代码照着训练经典打的: #include #include #include #include #include #include #include #include #include #include #include #include #include #define esp 1e-6#define pi acos(-1.0)#define pb push_back...
阅读全文
摘要:给定n个宇航员的年龄,平均年龄为 ave,根据下列要求分配任务: B任务只能分配给年龄=ave的宇航员; C任务可以任意分配。 给定m组互相憎恨的宇航员,要求他们不能分配到同一个任务。能否存在这样的一组任务分配。 每个宇航员都只能分配两种任务中的一种:A或C(年龄大于等于ave),B或C(年龄小于ave),那么为每个宇航员设立一个变量xi,xi为0表示分配C任务,为1则分配A或B(根据年龄...
阅读全文
摘要:每架飞机有早晚起降两种方式,给定n架飞机两种方式的起落时间,为每架飞机安排起落时间(早或晚),使得所有飞机起降时间按照早到晚的顺序之间的间隔时间最小值尽量大。 分析: 最小时间尽量大应该采用二分的方法比较好,然后就变成了判别某个时间间隔m是不是符合要求的了。为没加飞机设立一个变量xi,0表示早,1表示晚,然后每架飞机i用两个点2*i,2*i+1表示,前者如果被标记表示早,后者被标记表示晚降。 ...
阅读全文
摘要:给定n个命题之间的已经证明的关系如 a b表示已经证明蕴含式a→b,要求还需要再作多少次证明使得所有的命题都是等价的.将每个命题看成一个点,已经证明的命题之间连一条边,问题转化为添加多少条单向边使得图成为一个强连通分量. 先求出所有的强连通分量,然后缩点构成一个SCC图,统计其中入度为0的点个数a,以及出度为0的点的个数b,max(a,b)就是需要再作的证明.注意当图一开始就是强连通时,不需要作...
阅读全文
摘要:刘汝佳白书上面的一道题目:题意是给定一个联通分量,求出割顶以及双连通分量的个数,并且要求出安放安全井的种类数,也就是每个双连通分量中结点数(除开 割顶)个数相乘,对于有2个及以上割顶的双连通分量可以不用安放安全井。如果整个图就是一个双连通分量,那么需要安放两个安全井,种类数是n*(n-1)/2.代码来自刘汝佳白书: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include...
阅读全文
摘要:给定一个字符矩阵,s[i][j]为+,-,0分别表示ai+……….aj的和为正,负,0。可以将连续和转化为前缀差,即s[i][j]为+可以表示为B[j]-B[i-1]为正,B[i]表示前i项的和,B[0]为0,然后拓扑排序找出相对关系再依次取值即可。注意相同的B[i],B[j]要注意保存,最后两者的值统一。最终输出结果a[i] = B[i]-B[i-1]l.代码:#include #include #include #include #include #include #include #include #include #include #include #include #define e
阅读全文
摘要:从刘汝佳训练指南上看到的一道题,看了解释之后发现是一道最短路问题,(x,y,d,c)表示位于(x,y)点面向为d,颜色为c的状态,然后每个状态有左转,右转,前进3个转移方式也就对应三条边,然后建图求最短路就可以了。代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #define esp 1e-6 14 #define pb...
阅读全文
摘要:题目大意:在一个网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高 度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同 一个石柱上。这个应该还算是比较难的网络流的题目了吧, 至少对我这个刚刚接触新手的人来说只这样的,AC的过程是痛苦而又备受煎熬的,最后一步步调试下来成功提交的那刹那,感觉全身满满的正能量,闲话少扯了.
阅读全文
摘要:题目大意:给定n条单向边,求图中任意两点的连通路径的数目。其中点是从0-输入中出现的最大的点。可以用floyd-warshall算法或者dfs.for(int k = 0; k j的通路。 1 #include 2 #include 3 #include 4 #include 5 #define N 30 6 using namespace std; 7 int n, m, dp[N][N]; 8 9 void floyd(void)10 {11 for(int k = 0; k Path保存经过的点,并在dfs搜索下一个点之后再已经走过的Path里面查找看是否存在相应点,如...
阅读全文
摘要:差分约束系统的第一个题目,看了落花大神的博客后,对差分约束有了一定了解,关键在于建图,然后就是判断是否存在负权回路。关于差分约束系统的解释详见维基百科:http://zh.wikipedia.org/wiki/%E5%B7%AE%E5%88%86%E7%BA%A6%E6%9D%9F%E7%B3%BB%E7%BB%9F利用spfa判断时,当图中有顶点出队次数多于图中顶点数目时说明存在负环。其实我自己敲上去的时候改了一点点。大神的time[g[x][i].v]当达到n+1时就返回false,这是不对的,因为点包括0嘛,所以最终应该有n+1个点,判断就应该改为达到n+2,而且这一点也从uva上得到证
阅读全文
摘要:要问是否存在一个总权重为负数的环,用dfs即可解决。time:33ms 1 #include 2 #include 3 #define N 3000 4 using namespace std; 5 int n, m, T, w[N], u[N], v[N], next[N], first[N], pa[N], d[N], tag, i; 6 7 void read_graph(void) 8 { 9 for(int e = 0; e d[x] + w[i],也就是能够继续松弛下去说明图中存在负权回路。time:44ms速度还慢了一点,相比dfs 1 #include 2 #i...
阅读全文
摘要:这给题目和LIS类似,只不过是求连续的单调序列,用单调队列可破之,比如求LDIS(连续单增序列),如果a[i]大于栈顶元素入栈,将top作为序列长度,反过来再扫一遍就是包含该元素的单调递减序列,这样通过LCDS,LCIS函数可得到4个存储某元素左右的单调增,减的数组。然后枚举一遍就可以。 1 #include 2 #include 3 #include 4 #define N 1111111 5 #define INF 0x0f0f0f0f 6 using namespace std; 7 8 int stack1[N];//不要在函数里开大数组!!! 9 int n;10 void LCI.
阅读全文
摘要:题目意思很简单,四种操作:全部变成1,全部变成0,或者区间异或,查询区间1的个数,和区间连续的1的最大长度。理解起来没有问题,可是写起代码来发现非常繁琐,共用了9个数组,差不多200行了,第一次写这么长得代码,WA一次,后来发现某个地方rt 2 #include 3 #include 4 #include 5 #define N 111111 6 #define lson l,m,rt>1))) 27 lsum[rt]+=lsum[rt>1))) 29 lsum0[rt]+=lsum0[rt>1)) 31 rsum[rt]+=rsum[...
阅读全文
摘要:也是一个求最长连续单调区间的问题,不同于HDU 3308LCIS的是,单点更新变成了区间成段增加,没关系同样的方法可破之。由于是成段更新,所以比更新区间小的区间是最大连续区间长度是不变的,所以更新sum[rt],lsum[rt],rsum[rt]只需要更新到这些区间,然后向上合并就行了。但是速度还是慢了一点699ms,总觉得哪里还有改进的地方。 1 #include 2 #include 3 #include 4 #define lson l,m,rtA[mid]) 18 { 19 if(lsum[rt]==(m-(m>>1))) 20 ...
阅读全文
摘要:最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛 ,小媛姐。这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel这个题目,是一个求连续空区间的情况,而hdoj这个题目是求给定区间单调连续的最大区间长度,两个题目思路很相似,将节点rt用sum[rt],lsum[rt],rsum[rt]来描述,分别表示rt对应区间即[l,r]内满足条件的区间的最大长度,从左边端点l开始满足条件的最大区间长度,从右边r开始向左的满足条件的最大区间长度。void PushUp(int rt,int m,int mid)//mid表示更新区间的
阅读全文
摘要:1 #include 2 #include 3 #include 4 #include 5 #define N (10010>1; 55 build(lson); 56 build(rson); 57 PushUp(rt); 58 } 59 60 void update(int p,int del,int l,int r,int rt) 61 { 62 if(l==r) 63 { 64 double rad=getrad(del); 65 Rotate(rt,rad); 66 return; ...
阅读全文
摘要:这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见“情况时,由于[1,2],[2,3]将2,3端点覆盖,最终得不到[1,5]和区间[1,4]”可见“的情况,而实际上两者的[2,3]区间是可以存在一条水平线将其直接相连的。接下来将要更新的区间按照x从小到大排序,然后依次查询,查询之后再更新就行。这样可以得到一个描述各个区间的相互关系的图G[N],G[i]存储的是在区间i右边的”可见“的区间,最后暴力统计一下,就可以解决问题了。 1 #includ.
阅读全文