《1》C++中bill的用法:
#include<algorithm>
using namespace std;
int b[10];
fill(b,b+10,20);
把数组的值设为20;
《2》ayley公式 :
一个完全图K_n有n^(n-2)棵生成树,换句话说n个节点的带标号的无根树有n^(n-2)个。 nyoj 127
《3》STL之priority_queue(优先级队列)
如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中
访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列这种数据结构。
优先级队列是0个或多个元素的集合,每个元素都有一个优先权,对优先队列执行的操作有(1)查找(2)插入一个新元素(3)删除
一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.对于优先权相同的元素,可按先进先出的次序处
理或按任意优先权进行。
priority_queue:
头文件:#include<queue>
using namespace std;
empty() 如果优先队列为空,则返回真
pop() 删除第一个元素
push() 加入一个元素
size() 返回优先队列中拥有的元素的个数
top() 返回优先队列中有最高优先级的元素
另外,需要自己定义优先级类型~也就是在结构体中加入一个函数,让元素排好队,重载运算符~
struct E
{
int x,y,steps;
friend bool operator < (E a,E b)
{
return a.steps>b.steps;//按从小到大排列
}
}tar;
E temp;
《4》vector
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法模板和函数库。vector之所以被认为是一个容器,
是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
头文件:#include<vector>
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector;
vector<int>s;
或者连在一起,使用全名:
std::vector<int>s;
建议使用全局的命名域方式:
using namespace std;
vector成员函数:
s.max_size() 返回容器中最大数据的数量
s.push_back(a) 在尾部加入一个数据
s.size() 返回容器中实际数据的个数
s.empty() 判断容器是否为空
s.clear() 移除容器中所有数
《5》关于最大匹配
最小顶点覆盖=最大匹配数
最小路径覆盖=顶点数—二分图的最大匹配数
二分图最大独立集=顶点数—二分图最大匹配数
独立集:图中任意两个顶点都不相连的顶点集合
相等子图的完全匹配一定是二分图的最大权匹配
KM算法基于以下定理:若由二分图中所有满足A[i]+B[j]=W[i][j]的边(i,j)构成的子图(称作相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配。
如果二分匹配中,图中的每个顶点都和图中的某条边相关联,则称为完全匹配或完备匹配。
二分图中,有一个问题是,顶点覆盖问题
如果覆盖每个顶点需要付出不同的代价,也可以说是不同的花费或称为点权问题,可以描述成,在保证覆盖所有边的情况下,如何使得权和最小。
建源点S和汇点T.假设二分图两个点集分别为X和Y.X和Y原来的边容量设为INF,将S到X里每个点x连一条边,边权为X的点权,也可以看做覆盖点X的所有出边的花费(W-),将
Y里每个点y到T连一条边,边权为Y的点权,也可以看做覆盖点Y的所有入边花费(W+),这样求得最小割容量即为原问题的解。