摘要: 一. 设无向图G的顶点个数为n,且无孤立顶点,则 ① 设M为G的一个最大匹配,对于G中M的每个未盖点v,选取一条与v关联的边所组成边的集合为N,则W=M∨N为G中的最小边覆盖。 ②设W1为G的最小边覆盖,若G中存在相邻的边就移去其中一条,设移去的边集为N1,则M1=W1-N1为G中的一个最大匹配。 ③边覆盖数+边独立数=n。 二.对于二部图 ①二部图的点覆盖数等于匹配数。 (该定理正确性可从求法上看出,二部图的匹配数可用网络流来做,最大流即最大匹配,而点覆盖数也是用网络流来做,而且建图方式相同,然后求最小割,因为最大流等于最小割,所以原定理成立。) ②点独立数=顶点个数n-匹配数(由二①) 阅读全文
posted @ 2013-09-19 15:03 贝尔摩德 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 最近在看这一部分的内容,想把定理及自己想的一些证明都整理一下,欢迎指正和补充~~(G为无向图)① 若G中无孤立顶点,则存在一个支配集V1,使得G中除V1外的所有顶点也组成一个支配集。(从某顶点开始,将它标为1,与它相邻的标为2,与2相邻的标为1,标过的不用再标,直到标完,则集合1与集合2满足这一性质)② 若G中无孤立顶点,V1为极小点支配集,则G中除V1外的顶点集合V2也组成一个支配集。 (对于V1中任意顶点,只有两种情况,与V2邻接和不与V2邻接,假设都邻接,那么V2是支配集,得证,假设某顶点x不与V2邻接,则对于V1,若去掉点x,它仍是支配集,与它是极小的矛盾,得证)③一个独立集是极大独立 阅读全文
posted @ 2013-09-16 13:26 贝尔摩德 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 题目大意:有m个猪圈,每个猪圈都有锁,有n个顾客,每个顾客都有某几个猪圈的钥匙,顾客按先后顺序来,并且每个顾客购买量有一个上限bi,当一个顾客来了后打开一些猪圈,这些猪圈里的猪可以来回调整,问最多能卖出多少猪。网络流问题难在建模,还需多做题多接触建模的方法。将顾客看做节点,引入源汇两点,每个顾客节点与汇点连接一条容量为bi的边,表示购买上限,每个猪圈的第一个打开的顾客节点与源点连接一条容量为该猪圈猪的总数的边,每个猪圈之后再来的人则与第一个顾客连接一条容量为正无穷的边,因为第一个顾客来了后可以调整数量,然后求最大流即可。#include #include #define INF 3000000 阅读全文
posted @ 2013-09-13 21:54 贝尔摩德 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 题目大意:农场有k个挤奶器,每个挤奶器最多容纳m头奶牛,所有奶牛和挤奶器之间的距离已知,安排奶牛挤奶方案使得所有奶牛中走的最大距离最小化。利用最大流来做,奶牛和挤奶器看做图中节点,先用floyd算出每个节点之间的最小距离,二分最大距离d,然后建图,边长大于d的都去掉,然后建立网络,引入源点和汇点,源点到每个奶牛节点连接一条容量为一的边,挤奶器节点与汇点连接一条容量为m的边,奶牛节点与挤奶器节点间连接容量为一的边(如果之间有边的话),然后求最大流,不断二分。代码为dinic算法#include #include #define MAX 300#define INF 10000000int dis 阅读全文
posted @ 2013-09-07 20:31 贝尔摩德 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 题目大意:对于一个排水系统,求它的最大排水速度。即最大流,用的是标号增广路算法。#include #include #include #define INF 100000000int min(int a,int b){ if(a>b) return b; else return a;}struct node{ int c,f;}map[210][210];int m,n,flag[210],prev[210],alpha[210];int queue[300];int qs,qe,v;void ford(){ int i; while(1) { memset(flag,-1,sizeof 阅读全文
posted @ 2013-08-25 17:01 贝尔摩德 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 基础知识 欧拉回路是图G中的一个回路,经过每条边有且仅一次,称该回路为欧拉回路。具有欧拉回路的图称为欧拉图,简称E图。 无向图中存在欧拉回路的条件:每个点的度数均为偶数。 有向图中存在欧拉回路的条件:每个点的入度=出度。 欧拉路径比欧拉回路要求少一点: 无向图中存在欧拉路径的条件:每个点的度数均为偶数或者有且仅有2个度数为奇数的点。 有向图中存在欧拉路径的条件:除了2个点外,其余的点入度=出度,且在这2个点中,一个点的入度比出度大1,另一个出度比入度大1。 欧拉路径的输出:经典的套圈算法。 下面来重点讲讲混合图的欧拉回路问题。 混合图就是边集中有有向边和无向边同时存在。这时候需要用网络流建模求 阅读全文
posted @ 2013-08-24 16:56 贝尔摩德 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 因为s2可以出现在s1的一头一尾,所以要在s1末端补上s1开头的一截长为s2的字符,然后进行一遍kmp。#include #include char a[200020],b[100020];long p[100020];int main(){ long i,j,n,k,x,y; int flag; while(scanf("%s",&a)!=EOF) { flag=0; scanf("%s",&b); x=strlen(a); y=strlen(b); for(i=x;i>0;i--) ... 阅读全文
posted @ 2013-08-18 21:01 贝尔摩德 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 裸的kmp#include long a[1000020],b[10020],p[10020];int main(){ long i,j,n,k,x,y; int flag; scanf("%ld",&n); for(k=0;k0&&b[i]!=b[j+1]) j=p[j]; if(b[i]==b[j+1]) j++; p[i]=j; } j=0; for(i=1;i0&&b[j+1]!=a[i]) j=p[j]; if(b[j+1]... 阅读全文
posted @ 2013-08-18 20:52 贝尔摩德 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?” 解决这类问题,通常我们的方法是枚举从A串的什么位置起开始与B匹配,然后验证是否匹配。假如A串长度为n,B 阅读全文
posted @ 2013-08-18 20:49 贝尔摩德 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给出一些单词,问能否摆成类似成语接龙的顺序(即前一个单词的最后一个字母要和下一个单词首字母相同)。对于每个单词,只有首尾两字母重要,该单词可看做由首字母到尾字母的一条边,即所有单词的首尾两字母看做图中节点,每个单词可看做一条边,构造好有向图后,若要摆成题意要求的顺序,即判断是否存在欧拉回路即可。#include #include int t,n;char word[1001];//存储每个单词int od[30],id[30];//每个顶点的出度和入度int bused[30],p[30];//bused表示该顶点是否存在,p是并查集中的父节点struct edge{ int u,v 阅读全文
posted @ 2013-08-18 15:28 贝尔摩德 阅读(175) 评论(0) 推荐(0) 编辑