上一页 1 ··· 7 8 9 10 11 12 下一页

2013年3月31日

Truck History POJ 1789 ZOJ 2158 Prim算法

摘要: 就是Prim算法,求最小生成树,把每个汽车编号看成点,两个编号的距离,也就是相同位置不同字符的数目,就看做边,显然,看成无向图,谁生成谁自己想想就行了 ,这里边比较多,用Prim算法。代码:View Code 1 #include <cstdio> 2 #define MAXN 2005 3 int n; 4 int lowcost[MAXN]; 5 int edge[MAXN][MAXN]; 6 int dis(char a[],char b[]) 7 { 8 int s = 0; 9 for(int i=0; i<7; i++)10 if(a[i] != ... 阅读全文

posted @ 2013-03-31 21:21 allh123 阅读(144) 评论(0) 推荐(0) 编辑

Network POJ 1861 ZOJ 1542 Kruskal算法 提问方式有点变化而已

摘要: 和ZOJ 1203解法一样,不赘述,我都直接复制的代码修改了一下贴代码:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 #define MAXN 1020 6 #define MAXM 15020 7 using namespace std; 8 int n,m; //n为顶点个数,m为边数 9 struct ArcNode10 {11 int u,v; //一条边的起点和终点12 int w; //边的权 阅读全文

posted @ 2013-03-31 01:34 allh123 阅读(208) 评论(0) 推荐(0) 编辑

ZOJ 1203 Swordfish Kruskal算法求最小生成树

摘要: 就是如题的做法,在一个连通图中找一条最小生成树,Kruskal的思想就是先根据所有边的权值按小到大排序,然后依次选择边进最小生成树里,但是要排除该边加进去后出现了环,生成树里是不能有环的,这样的边就不能加入,在挑选了n-1(n为图中点的个数)条边后就结束,可以证明这样构造出来的图就是最小生生成树。再判断是否会出现环时用到并查集。int temp = parent[r1] +parent[r2];//两根结点所带结点的总数,因为写错了这句,我检查了N久,砸墙,我很激动地写成了 int temp = Find(r1)+Find(r2);然后各种程序各种混乱了。还有一点因为没有看见说每两个case中 阅读全文

posted @ 2013-03-31 00:54 allh123 阅读(197) 评论(0) 推荐(0) 编辑

2013年3月30日

POJ 2582 拓扑序列,其实更为准确的说法应该是判是否出现环

摘要: 这个题我是看书上解题思路做的,自己未必想的出来,就是根据他给你的窗口分布去构造图,比如说这个格子本来可以被1,2,4,5窗口共用(只是指1,2,4,5都能出现在这个格子上,但是一次当然只可能出现一种情况),现在被2占用了,那么2可能是覆盖了1,4,5窗口,这样就构造有向边<2,1>,<2,4>,<2,5>如此类推,把整个图构造出来后,出现环了 ,证明电脑坏掉了,鉴于我相当水,只好用拓扑排序写,因为一共也就9个点,尽管拓扑时间复杂度高,但数据小,也就还能接受啦,不会超时。我0MS过的。如果可以,建议尽量用别的各种方法去判环。这题我也WA好多次,这次是因为忘了注 阅读全文

posted @ 2013-03-30 11:30 allh123 阅读(237) 评论(0) 推荐(0) 编辑

2013年3月29日

拓扑排序POJ 1094

摘要: 这题就是拓扑排序,但是能确定的情形必须是拓扑序列唯一。做法是在读边的时候 ,读完一条边后就调用topsort函数,如果通过topsort函数能确定出现环,则矛盾,或者存在了把所有 n个字母都包括进去了的唯一拓扑序列。就可以输出结果,以后就不调用topsort函数了。但是注意剩下的数据要读完,当读完所有的边上述两种情况都还没有出现,就可以输出不能确定了我是这样做的,在做拓扑排序时,先把入度为0的顶点入栈,该顶点入度设为-1(这样就不会重复入栈)如果出现两入度为0,可以知道不存在唯一拓扑序列了,别急,要接着做拓扑排序,从栈中 pop出元素,所有是该顶点后继的顶点的入度减一,再找入度为0的顶点入栈, 阅读全文

posted @ 2013-03-29 21:59 allh123 阅读(276) 评论(2) 推荐(0) 编辑

O(n*m)复杂度的多重背包coinsPOJ 1742

摘要: 思路是把物品看成是无限的,就像做完全背包一样从小到大更新,而事实上每种物品的数量却是有限的,所以还必须用count[j]记录当拼成j面值时用了多少个面值为ai的硬币,当在考虑面值k能否拼成时,如果count[k-ai]时已经用掉了re个ai面值的硬币了,如果re >= 该面值硬币的数量了,面值k就不能拼成,因为没这么多硬币了,如果小于该面值硬币的数量,面值 k能拼成,且count[k]为count[k-ai]+1.View Code 1 #include <cstdio> 2 #include <cstring> 3 bool v[100010]; 4 int c 阅读全文

posted @ 2013-03-29 17:04 allh123 阅读(210) 评论(0) 推荐(0) 编辑

2013年3月28日

HDU 4379 水题,大水,但我WA了很多次,做了很久

摘要: http://blog.csdn.net/diannaok/article/details/7875086?reload我是看着他的写的,但是有个小错误,在初始化值时,令>L/2中最大的数的初始值为L+1较为合适,想想1 3 3 1 4这组测试数据。这题我再详细说一下,我们试想在子集中最大的那个数怎么取,如果取<=M/2那么所有<=M/2的数一定都可以取,但是如果取一个>M/2的数的话,那么该子集只能取一个>M/2的数,取两个的话不就不满足yi+yj <= L了嘛,如此说来,就在>M/2的数中取一个最小的,在<=M/2的数中取最大的,如果加起来& 阅读全文

posted @ 2013-03-28 20:26 allh123 阅读(222) 评论(0) 推荐(0) 编辑

HDU 1712分组背包 考试复习安排

摘要: 就是每个组中只要选择一种,然后0-1背包一下。View Code 1 #include <cstdio> 2 #include <cstring> 3 int main() 4 { 5 int n,m; 6 while(~scanf("%d%d",&n,&m)) 7 { 8 int f[200],A[200][200]; 9 if(n == 0 && m == 0) break;10 for(int i=0; i<n; i++)11 for(int j=1; j<=m; j++)12 ... 阅读全文

posted @ 2013-03-28 12:43 allh123 阅读(133) 评论(0) 推荐(0) 编辑

2013年3月27日

POJ 2576 Tug of War二维背包恰好装满.

摘要: 像这种恰好装满的情况可以用bool数组,恰好装满为true,否则为false。还有就是逆向推倒,0-1背包,f[i][j]表示有i个人,组成了j的体重,这样的话在考虑某人的情形时,f[i][j]为真的前提就是f[i-1][j-wi]为真,其中wi为这个人的体重View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 bool f[110][2500]; 5 int main() 6 { 7 int n,w[110],sum = 0; 8 scanf("%d\n&q 阅读全文

posted @ 2013-03-27 21:22 allh123 阅读(272) 评论(0) 推荐(0) 编辑

所谓的二维背包Triangular Pastures POJ 1948

摘要: 这题WA了很多遍,要不就是测试数据 3 1 2 3 输出173,要不就是6 5 5 5 5 5 5 输出-1.甚至有时候把程序改的题目上的测试数据都过不了,各种悲摧,其实我喜欢边写程序边想,这是个很差的习惯,我一定要改!!!这题是看别人的提示写出来的,首先设bool型数组f,令 f[i][j]表示一边长为i,另一边长为j的边可以组合出来,然后在所有可以组合出来的情形中找能组合成三角形且面积最大的。f[i][j]能组合出来的条件是对于加入新边li来说是f[i-li][j] 或f[i][j-li]能组合出来,初始条件是f[0][0]能组合出来。因为题目中说了要用掉所有的栏杆,所以我只考虑两条边,剩 阅读全文

posted @ 2013-03-27 20:11 allh123 阅读(128) 评论(0) 推荐(0) 编辑

上一页 1 ··· 7 8 9 10 11 12 下一页

导航