摘要: 题目链接最短路的题,与一般的最短路不同的是,建图后每个结点有一个等级值(一个非负整数),要求最短路并且路线上的结点的最大等级差不超过给定值。这题一开始我想到的就是枚举等级区间,在对应区间内用dijkstra求最短路,复杂度是L*N2,L是给定的最大等级差,N为结点数,由于题中L的最大值没有给出,所以我担心会超时,写好后提交是WA而不是TLE,这也让我确定了此法的可行性。经检查发现导致WA的错误:1.建图错误,按题意应建有限图;2.有一个两重循环的下标重复了;3.松弛的时候忘了检查结点等级。View Code 1 #include <stdio.h> 2 #include <s 阅读全文
posted @ 2012-04-22 13:40 BeatLJ 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 题目链接并查集的题,食物链模型。题目大意:已知关于n个数的m条信息,信息有两类,一类是已知Ai比Aj大K,另一类是已知Ai为K,问是否能从这m条信息中唯一确定这n个数,或者能推出矛盾。View Code 1 #include <stdio.h> 2 #define N 10001 3 #define M 20001 4 int p[N],c[N],v[N]; 5 int a[M],b[M],cnt; 6 char vis[N]; 7 int n,m; 8 void make_set() 9 {10 int i;11 for(i=0;i<n;i++) p[i]=i,c[i... 阅读全文
posted @ 2012-04-22 10:09 BeatLJ 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 最短路径大体分为2种,单源最短路径和多对顶点之间的最短路径;导论上一句话写的比较好:边的权值还可以被解释为其他的某种度量标准,而不一定是距离。它常常被用来表示时间、费用,罚款,损失或者任何其他沿着一条路线性积累的和我们试图将其最小化的某个量;最短路径还和dp有一定的关系;因为他符合最优子结构和公共子问题;例如Floyd就是一种动归的解法;常用的求最短路的算法是Dijkstra算法A*算法 SPFA算法Bellman-Ford算法 Floyd-Warshall算法 Johnson算法 而各个算法的基本思想都是松弛,松弛是改变最短路径和前驱的唯一方式;上面的算法之间的区别在于对每条边进行松弛操作的 阅读全文
posted @ 2012-04-21 15:39 BeatLJ 阅读(780) 评论(0) 推荐(0) 编辑
摘要: 题目链接枚举题。第一次WA可能是因为读数据时用了getchar()吸收回车。View Code 1 #include <stdio.h> 2 #define N 1005 3 char map[N][N]; 4 int n,m; 5 char equal(char a,char b,char c) 6 { 7 return (a==b&&b==c); 8 } 9 char is_combo()10 {11 int i,j;12 for(i=0;i<n;i++)13 {14 for(j=0;j+2<m;j++) if(equal(map[i][... 阅读全文
posted @ 2012-04-21 14:53 BeatLJ 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 题目链接求单源最短路的题,因为边权非负,所以可以用dijkstra。这题有一点需要注意的地方是有重边,在读数据时取较小的即可。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MIN(a,b) ((a)<(b)?(a):(b)) 4 #define N 200 5 #define INF 2000000 6 int g[N][N]; 7 int dist[N]; 8 int n,m; 9 char vis[N];10 void dijkstra(int u)11 {12 int i,min 阅读全文
posted @ 2012-04-20 23:06 BeatLJ 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 题目链接这题与HDOJ1879有点不太一样,不能把不符合条件的边看成是已经修好的,使用克鲁斯卡尔时,碰到不符合的边直接跳过即可。View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #define D(x1,y1,x2,y2) (sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))) 5 #define N 101 6 #define M 5000 7 int x[N],y[N]; 8 struct node 9 {10 int a,b;11 阅读全文
posted @ 2012-04-20 22:21 BeatLJ 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 题目链接最小生成树的题。克鲁斯卡尔算法。View Code 1 #include <stdio.h> 2 #define N 100 3 #define M 5000 4 struct node 5 { 6 int a,b,d; 7 }edge[M]; 8 int n; 9 int p[N];10 void make_set()11 {12 int i;13 for(i=1;i<=n;i++) p[i]=i;14 }15 int find_set(int i)16 {17 return i==p[i]?p[i]:(p[i]=find_set(p[i]));... 阅读全文
posted @ 2012-04-20 21:23 BeatLJ 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 题目链接最小生成树的题。我用的克鲁斯卡尔算法。View Code 1 #include <stdio.h> 2 #define N 100 3 #define M 5000 4 struct node 5 { 6 int a,b,d; 7 }edge[M]; 8 int n,m; 9 int p[N];10 void make_set()11 {12 int i;13 for(i=1;i<=n;i++) p[i]=i;14 }15 int find_set(int i)16 {17 return i==p[i]?p[i]:(p[i]=find_set(p[... 阅读全文
posted @ 2012-04-20 21:07 BeatLJ 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 题目链接题目大意:给定n个整数,接下来有m个操作,操作分为两类,一类是修改操作:将第i个数改为k,另一类是查询操作:询问i,j之间第k大的数是多少。对于每个查询操作输出结果。如果没有修改操作,可以直接用伴随数组来做。跟POJ2104那题一样。这里的关键是修改操作,如果每次修改后都进行排序的话,肯定挂掉,注意到我们这里每次只修改一个数,只需将修改的数排到正确的位置即可,可以使用链表实现。这题的纠结之处在于数据格式,读入处理不好可能会WA或者RE。View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 阅读全文
posted @ 2012-04-20 20:44 BeatLJ 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 题目链接动态规划或者记忆化深搜。View Code 1 #include <stdio.h> 2 #define N 1005 3 char a[N],b[N],c[N][N]; 4 int n; 5 char dfs(int left,int right) 6 { 7 int k=right-left+1; 8 char f1=0,f2=0; 9 if(left==0&&right==n-1) return 1;10 if(c[left][right]!=-1) return c[left][right];11 if(left>0&&b[k] 阅读全文
posted @ 2012-04-19 22:46 BeatLJ 阅读(206) 评论(0) 推荐(0) 编辑