08 2012 档案

HDU 3338 Kakuro Extension
摘要:这一题花了我一晚上才搞定,不过蛮开心的。题目大意:原数谜是个很有趣的游戏,如图,每一行或每一列空白称为一个回,每一回都对应着一个整数sum,sum就是这回的和。这些空白格里只能填入1—9这九个数字,且在每一回中不能重复。全黑色的格为空,有数字的格,左下角的表示列的和,右上角的表示行的和,则可以得到下面这个图。但这道题不是原来的数谜,这题与原数谜相比,少了一点规则,就是,每一回中出现的数字可以重复。给你一个n * m 的图,让你填充一下。这题可以用网络流做。以空白格为节点,假设流是从左流入,从上流出的,流入的容量为行和,流出来容量为列和,其余容量不变。求满足的最大流。由于流量有上下限限制,可以给 阅读全文

posted @ 2012-08-16 22:49 我的ACM之路 阅读(754) 评论(0) 推荐(0)

ACM 常见算法
摘要:ACM算法一、数论算法 1.求两数的最大公约数 2.求两数的最小公倍数 3.素数的求法 A.小范围内判断一个数是否为质数: B.判断longint范围内的数是否为素数(包含求50000以内的素数表):二、图论算法1.最小生成树A.Prim算法: B.Kruskal算法:(贪心) 按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。2.最短路径 A.标号法求解单源点最短路径: B.Floyed算法求解所有顶点对之间的最短路径: C. Dijkstra 算法:3.计算图的传递闭包4.无向图的连通分量 A.深度优先 B 宽度优先(种子染色法)5.关键路径 几个定义: 顶点1为源点,n为汇 阅读全文

posted @ 2012-08-14 20:21 我的ACM之路 阅读(3990) 评论(0) 推荐(1)

POJ 1325 Machine Schedule
摘要:首先构造二部图,把A的n个model和B的n个model看作图的顶点,如果某个任务可以在A上的_imodel或者B上的_jmodel上完成,则Ai,Bj链接一条线,建立一个关系。那么本体就转化为求二部图的最小点覆盖集问题了View Code 1 #include<iostream> 2 using namespace std; 3 #define MAXN 105 4 int n1,n2; 5 int hn; 6 int g[MAXN][MAXN]; 7 int ans; 8 int sx[MAXN],sy[MAXN]; 9 int cx[MAXN],cy[MAXN];10 11 阅读全文

posted @ 2012-08-13 23:38 我的ACM之路 阅读(198) 评论(0) 推荐(0)

POJ 1469 COURSES
摘要:很明显,本题目求的是二分图的最大匹配问题,只要匹配等于课程门数,就可以结束程序输出“YES”,否则当循环完之后还没有覆盖住所有的课程,则输出‘NO’View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 301 6 int match[MAXN]; 7 int map[MAXN][MAXN]; 8 int vis[MAXN]; 9 int P,N; 10 int find(int x)11 {12 f 阅读全文

posted @ 2012-08-13 23:32 我的ACM之路 阅读(212) 评论(0) 推荐(0)

HDU 1068 Girls and Boys
摘要:题目可以很容易的转化为先求二分图的最大匹配,然后拿总人数减去最大匹配值就得到最终结果。题目关键是建立关系图,因为是男和女的关系,但输入数据的时候没有说明那个学号是那那个学号是女,所以你就建立一个总人数*总人数的关系矩阵,求得的最大匹配值除以2就可以了,因为相同的增广链你求了两边。代码如下;View Code 1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cstring> 5 #include<vector> 6 #define MAXN 1010 阅读全文

posted @ 2012-08-13 23:27 我的ACM之路 阅读(579) 评论(0) 推荐(0)

HDU 2063 过山车
摘要:简单的最大二分图匹配View Code 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 #include<cstdio> 5 #include<cstring> 6 7 #define MAXN 505 8 9 int match[MAXN];10 int map[MAXN][MAXN];11 int vis[MAXN];12 int K,M,N; 13 14 int find(int x)15 {16 for(int i=1;i<=N;i++)17 { 18 阅读全文

posted @ 2012-08-13 23:21 我的ACM之路 阅读(181) 评论(0) 推荐(0)

POJ 3041 Asteroids 题解
摘要:简单的二分图最大匹配View Code 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 #include<cstdio> 5 #include<cstring> 6 7 #define MAXN 510 8 9 int match[MAXN];10 int map[MAXN][MAXN];11 int vis[MAXN];12 int K,M,N; 13 14 int find(int x)15 {16 for(int i=1;i<=N;i++)17 { 18 阅读全文

posted @ 2012-08-13 23:18 我的ACM之路 阅读(229) 评论(0) 推荐(0)

POJ 1422 Air Raid
摘要:二分图的最少边匹配,即找出最少的边可以覆盖所有的点。用匈牙利算法找出最大匹配,则最终结果为:ans = 图的顶点数 - 最大匹配。代码如下: 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 #include<cstdio> 5 #include<cstring> 6 7 #define MAXN 125 8 9 int match[MAXN];10 int map[MAXN][MAXN];11 int vis[MAXN];12 int n,m; 13 14 int 阅读全文

posted @ 2012-08-13 23:09 我的ACM之路 阅读(238) 评论(0) 推荐(0)

HDU 棋盘游戏 题解
摘要:刚刚读这一题时以为这一题与Fire Net一样,后来才发现题目上面阴影部分不影响车的相互攻击,这就说明一行一列只能最多放置一个车。这一题目求放置最多车数目比较好求,直接就是二分匹配最大点集,关键是求重要点个数,那么我们可以依次去掉关联边,再求增广链,看求得的结果与开始求得的结果是否相同,如果不相同,则说明存在一个关键点。删边的代码:1 for(int i=1;i<=K;i++)2 {3 map[e[i][0]][e[i][1]]=0;4 int xx=getR();5 ... 阅读全文

posted @ 2012-08-13 23:05 我的ACM之路 阅读(1012) 评论(1) 推荐(0)

二分匹配KM算法
摘要:【KM算法及其具体过程】 (1)可行点标:每个点有一个标号,记lx[i]为X方点i的标号,ly[j]为Y方点j的标号。如果对于图中的任意边(i, j, W)都有lx[i]+ly[j]>=W,则这一组点标是可行的。特别地,对于lx[i]+ly[j]=W的边(i, j, W),称为可行边; (2)KM算法的核心思想就是通过修改某些点的标号(但要满足点标始终是可行的),不断增加图中的可行边总数,直到图中存在仅由可行边组成的完全匹配为止,此时这个匹配一定是最佳的(因为由可行点标的的定义,图中的任意一个完全匹配,其边权总和均不大于所有点的标号之和,而仅由可行边组成的完全匹配的边权总和等于所有点的标 阅读全文

posted @ 2012-08-13 21:19 我的ACM之路 阅读(1303) 评论(1) 推荐(0)

HDU 3309 Roll The Cube题解
摘要:Roll The CubeTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 273 Accepted Submission(s): 110 Problem DescriptionThis is a simple game.The goal of the game is to roll two balls to two holes each. 'B' -- ball 'H' -- hole '.' 阅读全文

posted @ 2012-08-12 12:14 我的ACM之路 阅读(442) 评论(0) 推荐(0)

POJ 2263 Heavy Cargo解题代码(SPFA)
摘要:看了网上很多都用Dijstra或者是Floyd算法解答的,于是自己就用SPFA解试了一下,一下AC过,虽然时间47ms;运用dist[v]=max(dist[v],min(dist[u],edge[u][v]));代码如下: 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 #define INF 200000 7 #define MAXN 201 8 9 struct node 10 { 1 阅读全文

posted @ 2012-08-10 21:23 我的ACM之路 阅读(248) 评论(0) 推荐(0)

POJ_3268_Sliver Cow Party结题报告
摘要:两次运用SPFA算法求最短路,所用的地图是相互反向的,采用的是邻接表表示 1 #include<iostream> 2 using namespace std; 3 #include<queue> 4 #include<cstdio> 5 #include<cstring> 6 #define INF 20000000 7 #define MAXN 1010 8 struct node 9 { 10 int to; 11 int w; 12 node * next; 13 }; 14 15 node * edge1[... 阅读全文

posted @ 2012-08-10 14:56 我的ACM之路 阅读(197) 评论(0) 推荐(0)

最短路——SPFA算法模板
摘要:1 #include<iostream> 2 using namespace std; 3 #include<queue> 4 #define MAXN 10 5 #define INF 100000000 6 struct node 7 { 8 int to; 9 int w; 10 node * next; 11 }; 12 13 node * List[MAXN]; 14 int path[MAXN]; 15 int dist[MAXN]; 16 int vis[MAXN]; 17 int n; 18 19 void SPFA(i... 阅读全文

posted @ 2012-08-10 10:51 我的ACM之路 阅读(291) 评论(0) 推荐(0)

POJ_3259_Wormholes
摘要:本题目实际上就是判断是否存在带负权回路,我用的是SPFA算法判断,原理是:如果存在负权值回路,则存在某顶点入队次数count1[v]>N(总的顶点数),所以只需添加一个数组记录顶点入队次数就行了。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #include<queue> 6 #define MAXN 600 7 #define INF 100000000 8 struct node 9 { 10 阅读全文

posted @ 2012-08-10 10:50 我的ACM之路 阅读(151) 评论(0) 推荐(0)

HDU_2112_HDU Today
摘要:HDU TodayTime Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6832 Accepted Submission(s): 1650 Problem Description经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。 这样住了一段时间,徐总对当地的 阅读全文

posted @ 2012-08-09 15:02 我的ACM之路 阅读(161) 评论(0) 推荐(0)

基于邻接矩阵的Dijstra算法-输出路径
摘要://基于邻接矩阵的Dijstra算法-输出路径 1 #include<stdio.h> 2 #include<string.h> 3 #include<stack> 4 #include<iostream> 5 using namespace std; 6 7 int n,m; 8 int map[1009][1009]; 9 int path[1009];10 int dis[1009];11 bool used[1009];12 const int maxint=999999999;13 14 void dijk()15 {16 memset 阅读全文

posted @ 2012-08-09 10:07 我的ACM之路 阅读(416) 评论(0) 推荐(0)

最短路径—基于邻接矩阵的的Dijstra算法模板(不输出路径)
摘要:1 #include<stdio.h> 2 #define MAX 0x3fffffff 3 int map[105][105],dis[105]; 4 bool use[105]; 5 int n,m; 6 7 void dijk(int start) 8 { 9 int min,rj,i,j;10 for(j=1;j<=n;j++)11 {12 dis[j]=map[1][j];13 use[j]=0;14 }15 use[1]=1;16 for(i=1;i<n;i++)17 {18 ... 阅读全文

posted @ 2012-08-09 10:05 我的ACM之路 阅读(337) 评论(0) 推荐(0)

最短路
摘要:主要三种算法:1、FLOYD:个人比较喜欢使用,不但可以快速计算计算多源最短路,也可以判断图的连通性。时间复杂度是(顶点^3)2、DIJK:从点的角度计算单源最短路比较方便吧,可以用邻接表优化(没用过,呵呵)。时间复杂度(顶点^2(朴素),顶点*log(顶点))3、SPFA+静态邻接表+队列储存:是从边的角度计算单源最短路,比较牛逼的算法,因为时间复杂度比较小(边*k),其中K是常数,注意用前两种算法时,因为这两种算法是从顶点思考,所以要小心重边的情况(有时题目没说明但自己要小心),每次读取边取小即可,用SPFA就没关系了网上说K~2,不过实际使用时K估计接近10,因为每个顶点差不多连10条左 阅读全文

posted @ 2012-08-09 10:02 我的ACM之路 阅读(278) 评论(1) 推荐(0)

HDU畅通工程系列题目
摘要:HDU 1863 畅通工程 (最小生成树)本题我采用的是克鲁斯卡尔算法,与一般的没什么区别,只是要加上一个记录最大村庄数目,如果并查集最后记录最大集合个数>=m(村庄数目)说明给的数据满足,否则输出‘?’HDU_1879继续畅通工程又是最小生成树,但有所不同的是有的路已经建好了,所以排序的时候要先考录路建设的状态 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #define MAX 5005 6 using namesp 阅读全文

posted @ 2012-08-08 21:30 我的ACM之路 阅读(258) 评论(0) 推荐(0)

HDU_POJ题目分类
摘要:基础题:1000、1001、1004、1005、1008、1012、1013、1014、1017、1019、1021、1028、1029、1032、1037、1040、1048、1056、1058、1061、1070、1076、1089、1090、1091、1092、1093、1094、1095、1096、1097、1098、1106、1108、1157、1163、1164、1170、1194、1196、1197、1201、1202、1205、1219、1234、1235、1236、1248、1266、1279、1282、1283、1302、1303、1323、1326、1330、1334、1 阅读全文

posted @ 2012-08-08 16:59 我的ACM之路 阅读(344) 评论(0) 推荐(0)

最小生成树
摘要:View Code 1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 #define Max 501 6 double map[Max][Max],d[Max]; 7 int n,i,j; 8 struct{ 9 int x,y;10 }point[Max];11 //记录从顶点集U到V-U的代价最小的边的辅助数组定义12 struct{13 int adjvex;14 double lowcost;15 }close... 阅读全文

posted @ 2012-08-08 15:35 我的ACM之路 阅读(293) 评论(0) 推荐(1)

导航