02 2013 档案
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1316意思很简单,就是让你计算在两个数之间有多少个斐波那契数,很挫的时我一开始把string的比较给搞错了,一直出不来结果。。。orz,还是直接上代码了。。View Code 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 const int N=1000; 5 using namespace std; 6 string f[N]; 7 int num[N]; 8 9 void solve
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1274一开始solve没有返回位置,然后递归的时候就出错了。。。STL特别好用。。。View Code 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int solve(string &str,string &restr,int pos){ 6 int len=str.length(); 7 while(pos<len){ 8 //是字母 9 if(str[p...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1239一道水题,素数筛选即可View Code 1 #include<iostream> 2 #include<cmath> 3 const int N=11000; 4 using namespace std; 5 bool mark[N]; 6 int prime[N]; 7 8 //素数筛选 9 void sieve_prime(){10 memset(mark,true,sizeof(mark));11 mark[0]=mark[1]=false;12 for(i..
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1238最主要的是要求字符串的子串,反串,直接用string;View Code 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 int n; 6 string s[111]; 7 8 int cmp(const string p,const string q){ 9 return p.length()<q.length();10 }1
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4081我就不说题意了,为了使A/B最大,就应该是B越小,故可以先求出n个点的最小生成树。因此,可以枚举每一条边,假设最小生成树的值是B, 而枚举的那条边长度是edge[i][j], 如果这一条边已经是属于最小生成树上的,那么最终式子的值是A/(B-edge[i][j])。如果这一条不属于最小生成树上的, 那么添加上这条边,就会有n条边,那么就会使得有了一个环,为了使得它还是一个生成树,就要删掉环上的一棵树。 为了让生成树尽量少,那么就要删掉除了加入的那条边以外,权值最大的那条路径。 假设删除的那个边的权值是M
阅读全文
摘要:判断最下生成树是否唯一的思路:1、对图中的每一条边,扫描其他边,如果存在相同权值的边,则对该边做标记。2、然后用Kruskal算法或Prim算法求MST。3、求得MST后,如果该MST中未包含做了标记的边,即可判断MST唯一;如果包含做了标记的边,则依次去掉这些边再求MST,如果求得的MST权值和原来的MST的权值一样,即可判断MST不唯一。针对poj 1679这题,采用Kruskal算法求MST,并判断MST是否唯一:代码如下:View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<algorit
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3367求pseudoforest伪森林,要求每个连通分量最多可以有一个环。求能构成的最大值我是用kruskal的方法按照求最大生成树那样求的,只不过要加一个判断,就是判断两颗子树是够成环,如果各成环,就不能合并,如果只有其中一个成环或者都不成环,那么就可以合并,并对其进行标记。。。View Code 1 #include 2 #include 3 #include 4 #include 5 const int N=10010; 6 using namespace std; 7 8 int n,m; 9 i..
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2489题目大意是有n个顶点的无向完全图,要你选m个点,使得m个点构成的图的m-1条边的权重之和比上m个点的值的和最小,即Sum(edge weight)/Sum(point weight)最小;由于题目的数据很小,因此我就直接暴力了。。。就是从n个点中先选m个点,对应一个最小值,然后对这m个点进行搜索就可以了。。。如果一开始就从第一个点就开始dfs,那么就可以保证最后的结果就是题目要求的。。。View Code 1 #include<iostream> 2 const int N=20; 3 co
阅读全文
摘要:http://www.cppblog.com/RyanWang/archive/2010/01/25/106427.html简单来说,就是有向的最小生成树:1、每个点找其最小的入边In[v] ? 如果有除跟节点以外的点找不到入边,则无解 : 否则答案累加In[v]2、看看有没有环 ? 无环则已经找到解,返回答案 : 将环缩点3、重新构图,每条边[u->v]的权值减去In[v],然后重复第一步模板题:hdu 2121:View Code 1 #include 2 #include 3 const int N=1010; 4 const int inf=10000000; 5 usin...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1232完全就是并查集的应用啊。。。View Code 1 #include<iostream> 2 const int N=1010; 3 using namespace std; 4 5 int n,m; 6 int parent[N]; 7 8 //初始化 9 void UFset(){10 for(int i=1;i<=n;i++){11 parent[i]=-1;12 }13 }14 //找根结点15 int Find(int x){16 int s;17...
阅读全文
摘要:通过这道题,我只想要说图论的题,建好了图,题就解了一大半了。。。这道题建好图后,dfs暴搜就行了。。。View Code 1 #include<iostream> 2 #include<cstring> 3 const int N=60; 4 using namespace std; 5 6 int n,m; 7 char map[N][N]; 8 int visited[N][N]; 9 int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//up/right/down/left10 int pip[11][4]={{1,0,0,1},
阅读全文
摘要:要熟练应用差分约束还是很困难的。。。题目的大意是:在每个区间[ai,bi]上至少选择ci个元素,构成一个集合S,使集合S中的元素最少;不妨设f(a)为区间[0,a]上的选择的元素个数;那么,由题意有f(b)-f(a-1)>=c,并且0<=(f(a)-f(a-1))<=1;从而建图;View Code 1 #include<iostream> 2 #include<queue> 3 #include<cstring> 4 const int N=50004; 5 const int Max=1000000; 6 using namespace
阅读全文
摘要:这也是我第一次碰到差分约束的题。。。好吧。。。赶紧学一下吧。。差分约束系统:假设有这样一组不等式:x1-x2<=0;x1-x5<=-1;x2-x5<=1;x3-x1<=5;x4-x1<=4;x4-x3<=-1;。。。。每个不等式都是有两个未知数的差小于等于某个常数(大于等于也可以,只要两边同乘以-1就可以了),这样的不等式组就称作差分约束系统(这个不等式组要么无解,要么有无数组解,因为若(x1,x2,x3....)是一组解,那么(x1+k,x2+k,x3+k,...)也必然是一组解);差分约束系统与最短路径的关系:差分约束系统的求解可以利用单源最短路径中的三
阅读全文
摘要:说实话,其实我还是喜欢用Dijkstra来求单源最短路径。。。但spfa算法有一个好处就是,可以用来处理负边,所以学一下还是有好处的。。况且,形式也很简单,与bfs形式上很相似。。。好吧。。。我还是简单介绍一下spfa算法吧。。。其算法实现过程如下:1、取出队列头顶点,扫描从顶点V出发的每一条边,设每一条边的终点为u,边<V,U>的权值为W,如果有dist[v]+w<dist[u],则修改dist[u]=dist[v]+w,修改path[u]=v;如顶点u不在当前队列中,还要将顶点u入队列;如果dist[v]+w>dist[u],则不做任何处理;2、重复执行以上步骤,直
阅读全文
摘要:题目意思很简单,就是让你求两天最短路中共同的公共点的最大个数可以这样理解:我们假设存在2组数据 v0,u0,v1,u1;用path[i][j]代表从点i到点j最短路上最多有多少个点!那么 edge[v0][i]+edge[i][j]+edge[j][u0]=edge[v0][u0]不就表示i到j的最短路为 v0到u0最短路的子路嘛;我们只需更新edge[i][j]中的最大值即可代码如下。。。。View Code 1 #include<iostream> 2 const int N=444; 3 const int inf=10000000; 4 using namespace st
阅读全文
摘要:题意还是比较好理解的,即如果矩阵A、B、C满足A*B=C,则代表矩阵A的第i个城市与代表矩阵B的第j个城市之间存在通路。。。orz。。。然后我就按一般的矩阵相等的条件去判断。。。结果TLE了。。。2000MS+了。。。然后就学了一下矩阵的优化。。。优化后。。。60MS。。orz。。。一开始的代码:View Code 1 #include 2 const int N=100; 3 const int inf=10000000; 4 using namespace std; 5 6 int edge[N][N]; 7 int n,m; 8 struct Matrix{ 9 int ma...
阅读全文