上一页 1 ··· 21 22 23 24 25 26 27 28 29 ··· 32 下一页
摘要: //用中国剩余定理解决韩信点兵问题#include <stdio.h>long long max,x,m[8],b[8],M[8],n,N;int p[8];int main(){ int i,j,k; for(n=1,i=0; i<8; i++) {scanf("%lld",&m[i]); n=n*m[i];} //读入除数数组,注意n,为所以除数的乘积 /***************检验n和m[]数组***************/ //printf("%lld\n",n); //for(i=0; i<8; i++) 阅读全文
posted @ 2012-11-23 19:24 Titanium 阅读(578) 评论(3) 推荐(0) 编辑
摘要: 并查集一.并查集的两个功能1.查询一个集合中的一个元素(或者说查询某个元素在哪个集合中)2.合并两个集合二.优化1.按集合的思想来看,并查集其实不是一个树形结构,就是一个普通的集合,查询是O(1),合并是O(n),必须扫描所有元素; 树形结构是优化出来的,下面的内容都是树形结构的,集合的那种就不说了,因为我们平时看到的并查集都是树形结构的2.优化主要是两个,一个是查询的优化——压缩路径,一边查询一边修改,这个优化足够强大了。 压缩路径:原本的树形可能是无规则的,最坏的条件是一条链状的,查询时就是O(n),压缩路径的原理很简单,当某一次查询一个元素x的时候,从x回到祖先的路径中所有元素都做 修改 阅读全文
posted @ 2012-11-23 18:54 Titanium 阅读(569) 评论(0) 推荐(0) 编辑
摘要: 并查集裸题,可以用来学习并查集的性质1.并查集判断是否成环,如果一条边的两个点的祖先相同,那么成环2.整个祖先数组中p[i]=i个个数就是连通分量的个数题目要求:1.若没哟普任何边直接输入0 0 要输出Yes2.若成环,No3.不管是否成环,图不连通,No4.注意输入中的点是任意的,编号并不连续,所以要标记哪些点出现在输入中,没有出现在输入中的点不要管#include <cstdio>#include <cstring>#define N 100010int p[N],use[N];int find(int x){ while(x!=p[x]) x=p[x]; ret. 阅读全文
posted @ 2012-11-23 17:55 Titanium 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 纯粹考察并查集,算是一个经典问题;统计一个集合中有多少个元素,然后找到元素个数最多的集合就普通的并查集,就能过了然后另外写了压缩路径,没想到时间没有改变然后再写一个,时间还是没有改变,好吧……………………只要懂基本的并查集的话,代码都不成问题,很裸的并查集而已代码一:纯粹#include <cstdio>#include <cstring>#define N 30000int p[N],c[N];int n,m;int find(int x){ return p[x]==x ? x : p[x]=find(p[x]); }int main(){ int T; scanf 阅读全文
posted @ 2012-11-23 16:22 Titanium 阅读(438) 评论(0) 推荐(0) 编辑
摘要: 先给出最大流BFS模板,其实就是白书上面的void BFS(){ flow=0; while(!q.empty()) q.pop(); while(1) { memset(a,0,sizeof(a)); a[s]=INF; q.push(s); while(!q.empty()) { int u; u=q.front(); q.pop(); for(int v=1; v<=n; v++) //枚举所有点v; <u,v> ... 阅读全文
posted @ 2012-11-22 23:35 Titanium 阅读(867) 评论(0) 推荐(0) 编辑
摘要: 最大流裸题,有向图,然后又重边,容量要累加,这里是用BFS来做的#include <cstdio>#include <cstring>#include <queue>using namespace std;#define INF 0x3f3f3f3f#define N 20queue<int>q;int f[N][N],c[N][N],a[N],p[N],flow;int n,m;//源点和汇点分别规定为1,nvoid BFS(){ flow=0; while(1) { memset(a,0,sizeof(a)); a[1]=INF; ... 阅读全文
posted @ 2012-11-22 23:10 Titanium 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 最大流裸题,不过要注意建图,有重边,容量要累加,然后是无向图,就当做是有两条方向相反的有向边处理即可,详细看读取数据建图部分然后就是按照白书上面的最大流模板(BFS)来做#include <cstdio>#include <cstring>#include <queue>using namespace std;#define INF 0x3f3f3f3f#define N 110int f[N][N],c[N][N],a[N],p[N];//a数组是一个递推数组,p相当于记录路径int n,m,s,t,flow;queue <int> q;voi 阅读全文
posted @ 2012-11-22 22:25 Titanium 阅读(808) 评论(0) 推荐(0) 编辑
摘要: dij和spfa记录前驱(或者说路径)是一样的,说白了就是不断替换终点,直到终点和起点相同那么就带了尽头而floy是不断替换起点,直到起点和终点相同那么就到了尽头输出路径可以递归输出,或者用一个栈来保存节点(相当于模拟递归)然后再一并输出想dij和spfa这种,因为是不断替换终点,所以如果是递归输出路径的话,是从终点开始递归,然后逆序输出,也就是在递归函数返回后再输出而floy这种,因为是不断替换起点,所以如果是递归输出路径的话,应该是从起点开始递归,然后顺序输出,即递归函数前就输出再递归 阅读全文
posted @ 2012-11-18 17:55 Titanium 阅读(1684) 评论(0) 推荐(0) 编辑
摘要: 推荐技术公众号:不爱睡觉的大猪 粗略讲讲SPFA算法的原理,SPFA算法是1994年西安交通大学段凡丁提出 是一种求单源最短路的算法 算法中需要用到的主要变量 int n; //表示n个点,从1到n标号 int s,t; //s为源点,t为终点 int d[N]; //d[i]表示源点s到点i的最短 阅读全文
posted @ 2012-11-18 17:35 Titanium 阅读(41098) 评论(7) 推荐(13) 编辑
摘要: 欧拉图的判定欧拉通路和欧拉回路——必须是存在欧拉回路的图才能称为欧拉图,仅仅是存在欧拉通路不称为欧拉图无向图的欧拉通路1.图连通可以用dfs去判断图连通或者用高效一点的并查集。用dfs的话其实就是遍历一遍图,并记录图有多少个连通分量,一般来说,在主函数中调用了多少次dfs就是有多少个连通分量。当连通分量数为1时说明图连通,大于1则不连通。用并查集的话,判断p[i]=i是否成立,在一个连通分量重只会有一个p[i]=i,若整个图出现多于一次p[i]=i,那么说明该图不止一个连通分量,即不连通2.度数为奇数的点称为奇点,在无向图欧拉通路中有且仅有两个奇点,这两个奇点必定一个是起点,一个是终点(显然可 阅读全文
posted @ 2012-11-18 12:09 Titanium 阅读(653) 评论(0) 推荐(0) 编辑
上一页 1 ··· 21 22 23 24 25 26 27 28 29 ··· 32 下一页