摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1443题目的大意就是说密码是n位的,所以有10^n种情况,然后由于当输入密码长度大于n时,只有最后n为有效。这样我们只要用一个(10^n+n-1)长的数字序列,就能破解这个密码。用DFS找一个欧拉回路,按照字典序输出路径。由于状态过多,不能用递归,要用非递归实现DFS,然后用stack会超时,那就自己写个数组吧 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include...
阅读全文
摘要:最小费用最大流: 即在所有最大流中,要求得到最少费用。(每条边有两个参数:容量cap, 费用cost)。 解法:每次找到费用最小的增广路。(即以费用为权的最短路) 仅需将最大流中的 bfs 替换为SPFA(因为有负权)。代码如下: 1 #define MAXN 1005 2 #define MAXM 10005 3 #define INF 0x3f3f3f3f 4 using namespace std; 5 6 struct P{ 7 int u, v, cap, cost, next; //容量cap, 单位流量费用cost。 8 }e[MAXM*4];...
阅读全文
摘要:算法简介:(复杂度 最坏O(VE^2) ) 不断寻找(bfs) 源点s 和 汇点t 之间的增广路,不断更新s流出量的值 以及 这条路上的 残余网络值,直到找不到增广路。 此时,s流出量的值达到最大,故称之最大流。 增广路:(不同于二分匹配那个) 这条路从源点开始一直一段一段的连到了汇点,并且,这条路上的每一段都满足流量 q;13 memset(vis, 0, sizeof(vis));14 pre[s] = s;15 vis[s] = 1;16 q.push(s);17 while(!q.empty()){18 int p =...
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1271因为盒子的方向是任意定的,所以把盒子的三个方向都存下来在dp会方便很多 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 struct Node10 {11 int x, y, z;12 }b[100];13 int n;14 15 bool cmp(const Node &a, const Node &b)16 {17 ...
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2067poj 3625 http://poj.org/problem?id=3625题目大意:有N个农场,现在给出他们的坐标,并且已经知道了有些农场他们之间是已经相连的了,现在问怎么连最小的边,能将这些农场都连接起来解题思路:变相的最小生成树,即将已经连起来的边的权值置为-1,那么根据prim算法,优先选的就是那条-1边,这样我们在选边的时候,如果是-1边我们就可以不用加进来 1 #include 2 #include 3 #include 4 #include 5 using n...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2069poj 3041题意:给出一系列的正整数坐标点,求最少需要几条直线覆盖所有点。思路:每个点可以由一条垂直的线或一条平行的线覆盖,用匈牙利算法计算出最大匹配,则是需要的直线的数目(意思为若有的点未被匹配到,那一定会被已连接它的某条线覆盖,可以想象成我找了一些横坐标不同的点,然后找每个x方向上的点的纵向是否能够匹配掉一些点,则这些可用垂直线连接)。若有点x,y 则x->y就有一条通路,每次x匹配y,若y已经被匹配,则看y的顶点是否有增广路径(即有其他的点x',y') 1 #
阅读全文
摘要:最大匹配——匈牙利算法 1 /**************************************************** 2 二分图匹配(匈牙利算法的DFS实现) 3 INIT:g[][]两边定点划分的情况 4 CALL:res=hungary();输出最大匹配数 5 优点:适于稠密图,DFS找增广路快,实现简洁易于理解 6 时间复杂度:O(VE); 7 ****************************************************/ 8 #include 9 #include 10 #include 11 using namespace std;12.
阅读全文
摘要:EOJ 1047 http://acm.cs.ecnu.edu.cn/problem.php?problemid=1047POJ 2771 http://poj.org/problem?id=2771二分匹配 不说了,直接上代码 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 #define MAXN 505 11 struct node 12 { 13 int h; 14 char ...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2614题意:求其最小生成树,且判断最小生成树是否唯一。prim法,判断唯一的方法:进行两次prim,第一次,每次加最小边时当出现多个最小边时,总是添加结点编号较小的那个,而第二次总是添加较大那个 (即若总是无多个最小边选择,最小生成树必是唯一的),若生成树是完全相同的则唯一,方法是:两次分别记录加边的情况,若加边情况相同则其唯一,否则有多个解。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1028这题以字符串作为节点,有一个字符串映射到节点序号1……N的问题,可以用map来解决这题数据不大,所以可以直接用floyd算法 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 const int INF = 9999999;10 int m[102][102];11 mapmy;12 int n;13 14 void floyd()15 {16...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2529题意,求修造为通路耗费的最小精力。即求无向图的最小生成树,此题注意结点是0到n 为n+1个,判断连通条件可以判断树的边数是不是为n,此题用prim 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 const int inf=999999999;12 int mat[105][105];13 in
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2124题意,电梯第i层能上升Ki层或下降Ki层,问从a到b的最短操作次数最短路floyd,建图时即是把x到x+ki x-ki (若存在)赋值为1,开始存为inf。 1 #include 2 #include 3 #include 4 using namespace std; 5 int mat[105][105]; 6 const int inf=99999999; 7 void floyd(int n){ 8 for(int k=1;k0) mat[i][i-x]=1; ...
阅读全文