摘要: 计算树上的路径长度。input要去查poj 1984。任意建一棵树,利用树形结构,将问题转化为u,v,lca(u,v)三个点到根的距离。输出d[u]+d[v]-2*d[lca(u,v)]。倍增求解: 1 #include 2 #include 3 #include 4 #include 5 #define rep(i,a,b) for(int i=a;iq; 22 23 void init() 24 { 25 tol=0; 26 clr(head,-1); 27 } 28 29 void add(int u,int v,int c) 30 { 31 edg... 阅读全文
posted @ 2013-08-15 09:31 Thousand Sunny 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 多校第七场考了一道lca,那么就挑一道水题学习一下吧= =最简单暴力的方法:建好树后,输入询问的点u,v,先把u全部的祖先标记掉,然后沿着v->rt(根)的顺序检查,第一个被u标记的点即为u,v的公共祖先。标记的时候又犯老毛病了:while,do while都不对,最后还是while(1)了T^T 1 #include 2 #include 3 4 const int MAXN=11111; 5 6 int p[MAXN],vis[MAXN]; 7 8 int main() 9 {10 int T,n,u,v;11 scanf("%d",&T);12 whil 阅读全文
posted @ 2013-08-14 17:05 Thousand Sunny 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 错成那样,还以为是卡时间卡精度的变态题,结果就那么ac了= = 悔死我了题意就不概述了,只要处理前两列即可。其中第一列顺序直接扫一遍,第二列要先处理较少的那几种。我是接着第一列用 head[] 继续处理,朋友给出了直接逆向处理的算法,更快、代码也会好写一点。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 const int MAXN=101; 7 int st[MAXN],ed[MAXN],head[MAXN]; 8 9 int main()10 {11 int n,m;12 while(~scanf... 阅读全文
posted @ 2013-08-13 22:56 Thousand Sunny 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 献上博文一篇http://hi.baidu.com/byplane747/item/53ca46c159e654bc0d0a7b8d设维度为k,维护(1 2 #include 3 #include 4 #include 5 #define rep(i,a,b) for(int i=a;iq[1<<5];21 int vis[MAXN];22 int a[5],b[1<<5];23 24 int main()25 {26 int n,cnt;27 while(~scanf("%d%d",&n,&cnt))28 {29 int op,s= 阅读全文
posted @ 2013-08-13 21:30 Thousand Sunny 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 关键是每条边必须走两遍,重复建边即可,因为确定了必然存在 Euler Circuit ,所以所有判断条件都不需要了。注意:我是2500ms跑过的,鉴于这道题ac的code奇短,速度奇快,考虑解法应该不唯一。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define rep(i,a,b) for(int i=a;istk;20 int head[MAXN],tol;21 int degree[MAXN];22 23 void init()24 {25 tol=0;26 clr(head,-1);27 }28 ... 阅读全文
posted @ 2013-08-13 11:04 Thousand Sunny 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 用新模板阿姨了一天,换成原来的一遍就ac了= =题意很重要。。最关键的一句话是说:若走A->B这条边,必然是d[B] 2 #include 3 #include 4 using namespace std; 5 6 const int MAXN=1111; 7 const int INF =0x0fffff; 8 9 int G[MAXN][MAXN],vis[MAXN],d[MAXN],n;10 int mark[MAXN],dp[MAXN];11 12 void dij(int n)13 {14 memset(vis,0,sizeof(vis));15 for(int ... 阅读全文
posted @ 2013-08-11 19:38 Thousand Sunny 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 坑了我一天的题目。。跑了20ms挂了,就知道有个小毛病= =无向图转有向图判强连通。首先要知道什么样的无向图可以转化为强连通图?连通分量(环)自然是可以的;那么扩大范围(存在割顶),发现点连通分量也是可以的;再扩大范围(存在桥),明显不能满足。所以边连通分量是实现无向图与强连通图转化的界限。那么如果原图本身不是边连通的呢?先缩点,问题转化为——怎样把无向无环图(森林)构建成边连通图:从度入手。其实真正要考虑的是叶子节点(degree==1),和部分根节点(degree==0或degree==1)。degree==0,需要加两条边;degree==1,一条;degree>=2,不需考虑。注 阅读全文
posted @ 2013-08-11 10:38 Thousand Sunny 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 最短路。把题目抽象一下:已知一张图,边上的权值表示长度。现在又有一些边,只能从其中选一条加入原图,使起点->终点的距离最小。当加上一条边a->b,如果这条边更新了最短路,那么起点st->终点ed的最小距离=st->a + a->b +b->ed 三个值的最短距离之和。于是正反求两次单元最短路。再将k条边遍历一遍就好了。最近在改代码风格,写起来很别扭。。uva又挂了,最让我不理解的是http://www.cnblogs.com/arbitrary/archive/2013/02/06/2908099.html这个家伙的代码竟然能ac,问题是我稍微改一下就sub 阅读全文
posted @ 2013-08-10 21:12 Thousand Sunny 阅读(439) 评论(1) 推荐(0) 编辑
摘要: 2-sat。又学到了一种使用的方法:当确定选择某中状态A时,从它的对立状态A^1引一条边add(A^1,A),从而使凡是dfs经过对立状态,必然return false;即保证若存在一种可能性,必然是经过该状态A的。题意:m个人对n个方案投票,每人之多投4票,是否存在一种方案使每个人所投的一半以上的票被采纳。依次输出每个议题最终的结果。1、注意是一半以上,我一开始理解成一半,结果无法根据必然性建边。 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int MAXN=555; 8 9 stru... 阅读全文
posted @ 2013-08-09 00:01 Thousand Sunny 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 2-sat。不错的一道题,学到了不少。需要注意这么几点:1、题目中描述的是有n对夫妇,其中(n-1)对是来为余下的一对办婚礼的,所以新娘只有一位。2、2-sat问题是根据必然性建边,比如说A与B二选一,那么当不选A时,必然选B。在本题中,我们所能确定的必然性只有一种:当一对通奸者中的一个人出现在新娘的对面时,另一个必须在新娘的同侧。一开始,我每次建的是两条边,即由新娘指向对面的一人,再从这个人,指向与新娘同侧的另一人(语言描述较困难,但我尽量简明的表达出来)。这是一种假设,因为新娘既可能在左边,又可能在右边。但是这不是必然性:“新娘指向对面的一个人”,这条边不存在必然关系。 解决办法:我们假. 阅读全文
posted @ 2013-08-07 19:32 Thousand Sunny 阅读(397) 评论(0) 推荐(0) 编辑