摘要: 编辑器加载中.../*题目: 问能否组成一棵树分析: 注意到该树为有向树,入度不能大于一,同时所有节点都应该能指向根, 可以用并查集查找是否有共同的根,有的话就不是树了,注意此时应该 要判断是否有两个入度,就不能用压缩路径的并查集,并且只能把出度 的点付给入度的点的并查集数组(不知道我自己理解是否有错。。。), 最后要判断是不是森林,可以用第一个点来检验与后面所有的节点是否 有交集,只要有一个没有的话,就是森林而不是树 (空树也是树。。。) 从poj中的discuss中找到 1: 0 0 空树是一棵树 2: 1 1 0 0 不是树 不能自己指向自己 3: 1 2 1 2 0 0 不是树.... 阅读全文
posted @ 2012-03-20 21:15 yejinru 阅读(167) 评论(0) 推荐(0) 编辑
摘要: /*分析: 由于有些物品存在多个,可以用数组逐一保存下,然后用01背包问题求解, 但是这样太耗时间,会造成time limitted,可以用二进制形式保存拥有多个 的物品,这样可以考虑完全并且比较省时间*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 100005int dp[X],cash[X];int main(){ freopen("poj1276.in","r",stdin); freope 阅读全文
posted @ 2012-03-20 14:45 yejinru 阅读(187) 评论(0) 推荐(0) 编辑
摘要: //这题用高精度乘法算#include <iostream>#include <cstring>using namespace std;#define X 140void multiply(int num[],int a[],int m) //高精度乘法运算{ int s[X]; memset(s,0,sizeof(s)); int i,j; for(j=0;j<m;j++) for(i=0;i<126;i++) s[i+j] += num[i]*a[j]; //核心算法,把乘完的结果保存到数组s[]中 int carry = 0; //表进位 for(i= 阅读全文
posted @ 2012-03-20 14:42 yejinru 阅读(235) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>#include <cstdio>#include <string>using namespace std;#define X 305string s;int map[X][X],color[X],n,x,y,len,c,ans;bool check(int a,int col) //检查顶点a的颜色能否涂成col{ for(int i=1;i<=n;i++) if(map[a][i]&&color[i]==col) //相邻节点颜色与他一样,不行 return false; return true 阅读全文
posted @ 2012-03-20 14:41 yejinru 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 编辑器加载中.../*题目: 问周游一圈后能不能换钱得到利润分析: 有向图是否处在负环问题,因为涉及每个顶点都可能存在负环, 直接用flord算法做即可*/#include <iostream>#include <string>#include <cstring>using namespace std;#define X 35string city[X],s1,s2;double map[X][X];int main(){ freopen("sum.in","r",stdin); freopen("sum.o 阅读全文
posted @ 2012-03-20 14:40 yejinru 阅读(179) 评论(0) 推荐(0) 编辑
摘要: /*题目: 象棋中马如何走到指定地点分析: BFS题,分8个方向搜就行 具体的图型可以看看poj1915题的8个方向,理解BFS后很容易写出*/#include <iostream>#include <cstring>#include <queue>#include <cstdio>using namespace std;#define X 310int sx,sy,ex,ey,n;bool visit[X][X];struct node{ int x,y,step;};bool check(int x,int y){ if(x<1||y& 阅读全文
posted @ 2012-03-20 14:35 yejinru 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 此方法是看了别人的题解的,利用像dp的思维做,f[m][n] = f[m][n-1]+f[m-n][n],其中f[m][n]表示m个水果n个盘子时总的放的方法数,因为f[m][n]总可以通过有空盘子或者没空盘子来放,f[m][n-1]表示有空盘子的情况,而f[m-n][n]表示没有空盘子的情况,思路非常巧妙#include <iostream>using namespace std;int ans;int dfs(int m,int n){ if(m==1) return 1; if(m<0) return 0; if(n==1) return 1; return dfs(m 阅读全文
posted @ 2012-03-20 14:33 yejinru 阅读(152) 评论(0) 推荐(0) 编辑
摘要: /*题目: 填充数独游戏分析: 先从后面开始搜,也就是从第八十个开始搜 1、如果一个小的方格内已经包含了非零的数,则继续向下搜 2、如果一个小的方格内是一个零数,也就是还没有放入相应的数,则对其从零到九开始尝试 3、对每一个数的尝试,检查其合法性:在其所在的3*3方格内是否合适;在此行是否合适,在此列是否合适 4、如果经过以上条件可以的话那么这个数字就可以放在此小方格上,然后继续进行搜索。*/#include <iostream>#include <cstring>#include <string>using namespace std;int a[10][ 阅读全文
posted @ 2012-03-20 14:28 yejinru 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 终于靠自己A了一道比较难的题了(n_n)据说是减枝题,不过我的剪枝还有待提高,以下做法竟然差点time limitted(985MS)我自己的思路:DFS搜索题,按当前需要构造的分数值,当前分母的总乘积,已经有了的个数,上一层分母值进行搜索,当遇到已经有了的个数等于a时,返回假,否则从上一层的分母值开始为下一个分数进行检查是否满足条件,满足的话答案加一#include <iostream>#include <cmath>using namespace std;#define X 1e-8int p,q,a,n;int ans;bool dfs(double cs,int 阅读全文
posted @ 2012-03-20 14:27 yejinru 阅读(286) 评论(0) 推荐(0) 编辑