上一页 1 ··· 69 70 71 72 73 74 75 76 77 ··· 85 下一页
  2011年10月3日
摘要: HDU_3715 我的第二个2-SAT的题目,^_^。整体的思路是二分深度,然后观察当前深度下是否能够推出矛盾。对于任意一个x[]只有0或1两种取值,并且只能为其中一种,为了便于分析,我们不妨设a[dep]的值为i,设b[dep]的值为j,设c[dep]的值为k,2*i这个点代表x[i]取0,2*i+1这个点代表x[i]取1。k一共有0、1、2三种取值,我们不妨分情况讨论一下x[]需要满足什么条件才可以达到下一个depth:①当k=2时,如果x[i]为1,那么x[j]必然为0,于是需要连一条有向边2*i+1->j,同理,如果x[j]为1,那么x[i]必然为0,于是需要连另一条有向边2*j 阅读全文
posted @ 2011-10-03 02:40 Staginner 阅读(329) 评论(0) 推荐(0) 编辑
  2011年10月2日
摘要: POJ_3648首先要注意两个和算法无关地方:①题目的输入数据存在诸如“2w5h”的情况,因此直接用scanf(“%s%s”,b1,b2)去读取数据会WA。②题目中的意思是找出一组能和新娘坐在一起的人,而题目中描述的对于人的限制都是指的对面的,因此我们要先利用已知把对面的人的序列构造出来,再输出对应的新娘这边的人的序列即可。这是我的第一个2-SAT的题目,做完一题相当于复习了好多图论的知识……总的来说,这类问题一般的步骤是这个样子的:①根据已知条件建图。比如这一题,已知的条件是x和y不能同时坐在对面(注意,与不能同时坐在一起是不同的),那么我们就要连两条边,x->~y,y->~x, 阅读全文
posted @ 2011-10-02 21:14 Staginner 阅读(452) 评论(0) 推荐(0) 编辑
  2011年10月1日
摘要: UVA_10801这个是一个求最短路的题目。首先我们用邻接矩阵G[i][j]表示第i个电梯是否可以到第j层,然后便用队列优化的Bellman-Ford算法去求解最短路即可。需要注意的是,在求最短路时枚举的必须是可以到达该点的电梯。同时,为了运算方便,我们可以假设第一次乘电梯时也需要等60s,最后再从结果中除掉这多余的60s即可,但由于数据中存在k=0的情况,所以在除去60s时要加一个判断。#include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h>#define IN 阅读全文
posted @ 2011-10-01 17:55 Staginner 阅读(496) 评论(5) 推荐(0) 编辑
摘要: UVA_11045 这个题目可以用网络流去做。首先,我们抽象出一个源点和一个汇,源点和各种衣服都连一条有向边,容量为N/6,人所对应的衣服和人之间连一条有向边,容量为1,人与汇点之间连一条有向边,容量为1,之后就可以用网络流的方法去解了,如果最后汇点的流量为M,则表示可以,否则就不可以。#include<string.h>#include<stdio.h>int N, M, T;int flow[110][110], cap[110][110], a[110], q[110], p[110];char b[][5]={"\0","XXL&q 阅读全文
posted @ 2011-10-01 08:03 Staginner 阅读(439) 评论(0) 推荐(0) 编辑
  2011年9月30日
摘要: UVA_10806 这个题目我们可以把边的容量设为1,费用设为权值,然后再引入一条边N-N+1,容量设为2,费用设为0,然后去求1到N+1的最小费用最大流,如果到N+1的流量为2,则输出最小费用,否则就是无解。在老大的指点下,自己亲手把以前没有写过的费用流的邻接表形式写了一遍。费用流应用邻接表时需要注意三个问题:①要把一条边的正向边和反向边各建一次,如果是无向图,可以把一个无向边看成两个有向边,然后建四条边存储。②在建边时多开一个数组op[],用于存储此边的反向边的标号,便于增广。③在记录父节点时,同时多开一个数组edge[],用于记录父节点连向该节点的有向边的标号,用于增广。有了邻接表形式的 阅读全文
posted @ 2011-09-30 23:28 Staginner 阅读(428) 评论(0) 推荐(0) 编辑
摘要: UVA_10608 为了计数方便,我们在初始化并查集的数组p[]时全部初始化成-1,让树根的p[]值代表该集合内的人数。在合并时,令p[tx]+=p[ty]即相当将两组的人数进行了相加,同时令p[ty]=tx即让两组数据同时指向了一个树根。#include<stdio.h>#include<string.h>int N,M,p[30010];int find(int x){ return p[x]<0?x:(p[x]=find(p[x])); }void init(){ int i,x,y,tx,ty; scanf("%d%d",&N, 阅读全文
posted @ 2011-09-30 21:29 Staginner 阅读(386) 评论(3) 推荐(0) 编辑
摘要: UVA_10099这个题目实际上要求所有路径中最小边的最大值。由于Floyd代码写起来很清晰,也比较容易解决这类问题,所以我就直接写了Floyd。 但是由于这个题目只有一组查询,所以Floyd的优势就不那么明显了,听了老大的思路之后,我便又写一个二分的程序,果然比Floyd快很多。#include<stdio.h>#include<string.h>int f[110][110];int main(){ int i,j,k,u,v,w,n,S,T,D,N,R,t,ans; t=0; while(1) { scanf("%d%d",&N,&am 阅读全文
posted @ 2011-09-30 14:15 Staginner 阅读(540) 评论(3) 推荐(0) 编辑
  2011年9月29日
摘要: UVA_10369题目的大概意思是,两个地点如果各有一个satellite channel,那么无论它们相隔多远都能通信,而如果任何一个没有satellitechannel的话,就只能靠radio通信,而radio通信的成本与距离D是成正比的,现在希望让所有地点都能直接或者间接通信,问最小的D是多少。这个题目实际上是在求一个最小生成森林的最长边,今天刚看到吉大模板上的最小生成森林,没想到立刻就用上了。最小生成树有两个特点,一个是保证了所有边的和是最小值,另一个是保证了所有边中的最大值最小。由于Kruskal算法每选中一条边就相当于把两个点集合并成了一个点集,最后用n-1条边连成了1个点集。那么 阅读全文
posted @ 2011-09-29 17:45 Staginner 阅读(420) 评论(0) 推荐(0) 编辑
摘要: UVA_10397 这个题目是一个求最小生成树的题目,只不过在求最小生成树之前要先用并查集对已经建好的边进行处理即可。#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>double x[1010],y[1010],w[1000010];int u[1000010],v[1000010],p[1010],r[1000010];int cmp(const void *_p,const void *_q){ int *p=(int *)_p; int *q=(int 阅读全文
posted @ 2011-09-29 16:46 Staginner 阅读(388) 评论(0) 推荐(0) 编辑
摘要: UVA_10048 这个题目是在求所有可达路径中最大值最小的一条路,并输出去其最大值。由题目特征,我们采用Floyd算法求解会方便一些。#include<stdio.h>#include<string.h>int f[110][110];int main(){ int i,j,k,n,t,C,S,Q,u,v,temp; t=0; while(scanf("%d%d%d",&C,&S,&Q)==3) { if(C==0) break; for(i=1;i<=C;i++) for(j=1;j<=C;j+... 阅读全文
posted @ 2011-09-29 16:16 Staginner 阅读(481) 评论(0) 推荐(0) 编辑
上一页 1 ··· 69 70 71 72 73 74 75 76 77 ··· 85 下一页