上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 42 下一页
摘要: 简单的LCA。。。dfs里fa的判断很重要呀。。。亲。。。 1 /* 2 LCA 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue>10 #include<map>11 #include<math.h>12 using namespace std;13 typedef long long ll;14 阅读全文
posted @ 2013-05-22 18:58 xxx0624 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 有向边!!! 1 #include<stdio.h> 2 #include<string> 3 #include<map> 4 #include<stdlib.h> 5 #include<iostream> 6 #include<algorithm> 7 #include<math.h> 8 using namespace std; 9 const int maxn = 200005; 10 struct node{ 11 int from,to,next,val; 12 }edge[ maxn<< 阅读全文
posted @ 2013-05-22 18:36 xxx0624 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 最近总觉得什么都忘了,什么都忘了。。。只好一遍又一遍的复习复习再复习。。。拓扑排序:拓扑排序是一种有向无环图的排序表示,表示顶点的出现顺序。如果有环 则无法表示。算法的关键在于:每次取出一个度为0的顶点(若同时存在多个0度节点,则表示该拓扑排序不唯一),记为S。然后把和S相连的点的度都减1.......重复该过程 即可得到答案。(如果点的个数比较小 可以暴力的写 即两重FOR循环搞定;要么就是用队列,把度为0的点入队。。。)恩。。。好像就这些了。。。 阅读全文
posted @ 2013-05-22 17:59 xxx0624 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,两者的时间复杂度都是O(N+M)。本文介绍的是Tarjan算法。[Tarjan算 阅读全文
posted @ 2013-05-22 17:51 xxx0624 阅读(490) 评论(0) 推荐(0) 编辑
摘要: 题意是个大坑。。。只要,保证有且只有一个人的入度是0,就yes。。 1 #include<stdio.h> 2 #include<string> 3 #include<map> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 const int maxn = 2005; 8 int ind[ maxn ]; 9 struct node{ 10 int u,next; 11 }edge[ maxn*2000 ]; 12 int cnt,head[ m 阅读全文
posted @ 2013-05-21 23:47 xxx0624 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 先判断是否存在环。。然后dfs出每个人比几个人要求高。。 1 ///* 2 //拓扑 3 //*/ 4 #include<stdio.h> 5 #include<string.h> 6 const int maxn = 10105; 7 int ind[ maxn ],add[ maxn ],vis[ maxn ]; 8 struct node{ 9 int u,next;10 }edge[ maxn<<2 ];11 int cnt,head[ maxn ];12 void init(){13 cnt = 0;14 memset( add,0,sizeof( 阅读全文
posted @ 2013-05-21 23:45 xxx0624 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 1 /* 2 用线段树不会写 3 4 dp 5 l[ i ]:表示左边>=h[i]的位置pos 6 */ 7 #include<stdio.h> 8 #include<algorithm> 9 using namespace std;10 typedef long long int64;11 const int maxn = 100005;12 int64 h[ maxn ],l[ maxn ],r[ maxn ];13 int main(){14 int n;15 while( scanf("%d",&n)==1 ){16 if( n 阅读全文
posted @ 2013-05-21 14:31 xxx0624 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 树这个数据结构内容真的很多,上一节所讲的二叉堆,其实就是一颗二叉树,这次讲的左偏树(又叫“左翼堆”),也是树。二叉堆是个很不错的数据结构,因为它非常便于理解,而且仅仅用了一个数组,不会造成额外空间的浪费,但它有个缺点,那就是很难合并两个二叉堆,对于 “合并”,“拆分”这种操作,我觉得最方面的还是依靠指针,改变一下指针的值就可以实现,要是涉及到元素的移动,那就复杂一些了。左偏树跟二叉堆比起来,就是一棵真正意义上的树了,具有左右指针,所以空间开销上稍微大一点,但却带来了便于合并的便利。BTW:写了很多很多的程序之后,我发觉“空间换时间”始终是个应该考虑的编程方法。:)左偏左偏,给人感觉就是左子树的 阅读全文
posted @ 2013-05-21 13:01 xxx0624 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 本来是简单题,不过就是题意难理解一点。。。对于两个数能相加 要保证每一位上相应位置上至少有一个0。 1 /* 2 水题不水 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 #include<map> 11 #include<math.h> 12 using namespace std; 1 阅读全文
posted @ 2013-05-20 23:38 xxx0624 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一些点,这些点本身有价值,并且可以同过某些点转化到自身。对于lev问题,可以进行枚举出每个点的lev,看哪些点与当前被枚举点是可以相互到达的。这样就解决了点点之间是否可以相互到达问题。对于路的权值问题,可以稍微进行转化,在更新dis的时候可以明白。dis[ j ] = min( dis[ j ],dis[ k ]+mat[ k ][ j ] ); //mat[ k ][ j ]:表示k到j的路径花费值 1 /* 2 dijkstra 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdl 阅读全文
posted @ 2013-05-20 22:47 xxx0624 阅读(235) 评论(0) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 42 下一页