【题目大意】给定一个棋盘,问一直马从起点跳到终点最少要用多少步?
【算法分析】BFS
【其它】1A
6415553 edward2 1915 Accepted 1780K 63MS G++ 936B 2010-02-05 22:30:07
【CODE】
#include
对于任意图:
|最小边覆盖|+|最大匹配|=|V|
二分图的最大匹配=最小点覆盖数
对于二分图:
以下数值等价.
最大匹配
最小点覆盖
|V|-最大独立集(二分图or有向无环图)
|V|-最小边覆盖数
|V|-最小路径覆盖数(有向无环图)
|V|-最小路径覆盖数/2(无向图)
(上面括号里有有向无环图的,均是将一个点拆成两个点连边匹配)
由于任意图的那几个几乎用不到于是这里只贴二分图的定义
最小点覆盖:理解为点覆盖边,即用最小的点覆盖所有的边。(若一条边的其中一个端点被选用,这条边就被覆盖了)
最大独立集:求一个最大的点集,里面的点不存在任何的边相连。
最小边覆盖:理解为边覆盖点,用最少的边把图中的点全部覆盖。
最小路径覆盖:用最少的路径把图中的所有点覆盖。
另外:最大独立集与最小覆盖集互补。
推广到有权的形式也一样,即最大点权独立集与最小点权覆盖集互补
求最小点权覆盖集可以这样求:
先对图黑白染色,然后向白色的点放X部,黑色的点放Y部。
1、连边[S,i],容量等于i的点权。(对于二分图的X集)
2、连边[i,T],容量等于i的点权。(对于二分图的Y集)
3、对于有边的i和j连边[i,j](i∈X,j∈Y),容量为INF
最后得出的最大流就是最小点权覆盖,实际上是最小割与之对应。
对于求了传递闭包以后的有向无环图:
最大反链=|V|-最大匹配
【题目大意】给出一个图,让你求出(点权/边权)最大的那个回路的(点权/边权)的值。
【算法分析】由于对于一个环,V=E。所以我们可以把点权赋到以这个点为起点的边上去。这样我们就可以认为点和边是一一对应的。于是他们对应的向量x也是一样的。
然后
ans=Vx/Ex
0=Vx/Ex -ans
0=(Vx-ans*Ex)/Ex
然后构造函数f(ans)=Vx-ans*Ex
(∵Ex>0 ∴Vx-ans*Ex=0与(Vx-ans*Ex)/Ex=0等价,且两者关于ans的单调性一致)
然后可以发现该函数关于ans递减。
然后利用二分枚举ans,再加spfa判图中是否还有正权环就可以了。
【其它】贡献3WA。。。ORZ,可恶的精度。
6411503 edward2 3621 Accepted 360K 672MS C++ 1573B 2010-02-04 22:02:39
【CODE】
#include