杂谈

《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+),这样求得最小割容量即为原问题的解。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值