上一页 1 ··· 24 25 26 27 28 29 30 31 32 ··· 34 下一页
摘要: 我的思路:用俩个数组分别记录出现过的节点的入度和出度,这样只有一个字母的入度比出度大1,一个字母的出度比入度大1,或者是所有有字母的出度和入度都一样,他就是欧拉路但这样还差了一个联通性的判断 于是我用了一个辅助数组 f[] 用并查集的方式判断是否连通代码:#include<iostream>#include<string>using namespace std;int f[30],c[30],r[30];char s[1005];int find(int x) { if(x==f[x]) return f[x]; f[x]=find(f[x]); return f[x] 阅读全文
posted @ 2011-08-03 09:27 枕边梦 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 欧拉路,欧拉回路小结 把欧拉路和欧拉回路做一个小总结,包含了一些题目,以后遇到新的我还会陆续加上。 定义: 给定无孤立结点图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在 一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。 关于欧拉路和欧拉回路定义及存在证明请看这里。 这里给出欧拉路和欧拉回路存在条件的结论: 存在欧拉路的条件: 无向图: 图连通,所有点都是偶数度,或者只有两个点是奇数度。当所有点是偶数度时欧拉路起点可以是任意 点;当有两个奇数度点时起点必须是奇数度点。 有向图: 图连通,所有点出度=入度,或者有一个点入度-出度=1, 阅读全文
posted @ 2011-08-02 23:17 枕边梦 阅读(2556) 评论(0) 推荐(1) 编辑
摘要: 优先队列+BFS+保存路径额,先记录前驱,再用栈输出路径,其他的,都快成模板了,最近打得很熟,就是输出的时候,一些小错误改了半天ORZ#include<iostream>#include<queue>#include<algorithm>#include<stack>using namespace std;char map[101][101];int vis[101][101],n,m,mins;bool rescue;int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};struct node{ int x,y,c 阅读全文
posted @ 2011-08-02 22:06 枕边梦 阅读(501) 评论(0) 推荐(0) 编辑
摘要: hdu2141唉,是我 想多了,用普通方法拼命剪枝,还是TLE直接将前俩个数组的和求出来并保存,之后就是一个二分查找的过程了二分的俩种写法第一种#include<iostream>#include<algorithm>#include<string>using namespace std;int a[501],b[501],c[501],f[250001];bool bin_search(int n,int key){ int left=0,right=n-1,mid=0,temp; while(left<right) { temp=mid; mi.. 阅读全文
posted @ 2011-08-02 17:10 枕边梦 阅读(523) 评论(0) 推荐(0) 编辑
摘要: 用栈来模拟操作,主要还是DFS注意回溯条件,还有遍历失败后的操作就没什么了#include<iostream>#include<stack>#include<string>#include<algorithm>using namespace std;char b[200],b1[100],b2[100];//b[]保存路径stack<char> ST;int len1,len2;int cmp( const void* c1,const void* c2){ return *(char *)c1-*(char *)c2;}void d 阅读全文
posted @ 2011-08-02 14:15 枕边梦 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿,终于还是AC了,DFS多开了几个数组,稍微加快了一点点,不然就超时了,原来,一点一点的剪枝,还是有那么一点点用滴,看代码吧#include<iostream>#include<queue>using namespace std;int prime[]={2,3,5,7,11,13,17,19,23,29,31,37};//相邻俩个数的和顶多就37,所以把其中的所有素数都直接打表了int a[20],b[20],n;bool hash1[40];void init()//哈希表{ memset(hash1,0,sizeof(hash1)); for(int i=0; 阅读全文
posted @ 2011-08-02 00:30 枕边梦 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿,题目罗嗦了半天,其实意思很简单,就是给定一个目标值target,再给你一个备选字符串(5~12个字符),要你在这个字符串里选5个出来,满足题中给定的等式,并且你选择的这5个字符组成的字符串必须是所有可能情况中按字典序最大的情况。 简单分析下就可以看出,就是一个组合问题,问题解的最大规模就是12取5,就是12*11*10*9*8*7,而最小规模是5取5,所以应该用枚举法就可以搞定。不过,枚举之前先排个序,就可以保证输出的是符合要求的最大的那个了#include<iostream>#include<string>using namespace std;int cmp( 阅读全文
posted @ 2011-08-01 22:13 枕边梦 阅读(1868) 评论(0) 推荐(0) 编辑
摘要: 嘻嘻,直接BFS水过……#include<iostream>#include<math.h>#include<queue>using namespace std;int map[9][9],si,sj,ei,ej,mins;int dir[8][2]={{2,1},{1,2},{-2,1},{2,-1},{1,-2},{-2,-1},{-1,-2},{-1,2}};struct node{ int x,y,dis; node(int _x=0,int _y=0,int _dis=0):x(_x),y(_y),dis(_dis){}; /* friend bo 阅读全文
posted @ 2011-08-01 19:06 枕边梦 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 恩,直接DFS,还好,不算很慢#include<iostream>#include<string>#include<algorithm>using namespace std;char map[21][21];int n,m,cnt;int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};void dfs(int si,int sj){ for(int k=0;k<4;k++) { int i=si+dir[k][0]; int j=sj+dir[k][1]; if(i>0&&i<=m&& 阅读全文
posted @ 2011-08-01 15:28 枕边梦 阅读(191) 评论(0) 推荐(0) 编辑
摘要: BFS+剪枝不剪枝直接TLE了呀,无语,剪枝真是一门学问,果然,搜索最重要的是剪枝#include<iostream>#include<queue>#include<string>#include<algorithm>using namespace std;int map[51][51][51],vis[51][51][51],a,b,c,mins,T,count1;int dir[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};bool escape;struct node{ 阅读全文
posted @ 2011-08-01 13:21 枕边梦 阅读(142) 评论(0) 推荐(0) 编辑
上一页 1 ··· 24 25 26 27 28 29 30 31 32 ··· 34 下一页