图论
paul08colin
这个作者很懒,什么都没留下…
展开
-
Bellman-Ford算法 单源最短路径(o(nm))
解决的问题依旧是找出A城市到B城市的最短路径Bellman-Ford算法,找出各个顶点间的最短路径,路径权值可以是负数,但是不能存在负权回路(在这一回路中存在负权路径)。而Dijkstra算法,是找出某个顶点到其它顶点的最短路径。当然Dijkstra也可以找出各个顶点间的最短路径,只要做n次Dijkstra就行了。思路:对每对顶点i、j,不断缩小i到j的最短路径的权。在i、j中加入顶点k,判断从i到k和k到j路径的和是否小于i到j的路径长度,如果是将k加入,并调整i到j的路径长度。缩小的条件: a[i][j转载 2010-07-27 20:52:00 · 467 阅读 · 0 评论 -
POJ2186 强连通分支(Strongly_Connected_Components)
#include #include #include #include using namespace std;const int MAXM=50000;const int MAXN=10000;int finish[MAXN+5];vector adjacent[MAXN+5];vector radjacent[MAXN+5];bool visit[MAXN+5];int finishtime;int distribute[MAXN+5];bool s原创 2011-03-21 12:17:00 · 534 阅读 · 0 评论 -
POJ1300 Door man欧拉图
无向图欧拉图:(连通图) 1、所有点的度为偶数,从当前点出发,能回到原来的点2、有两个点度数奇数,从其中一个奇数点出发,终止于另一个奇数度数的点。#include #include #include #include using namespace std;i原创 2011-07-15 20:54:03 · 322 阅读 · 0 评论 -
POJ 1386 欧拉通路
这题是很明显的欧拉图,可以用每个单词的首字母和末字母组成有向边,首字母指向有向边,假如它们能构成欧拉图就能解开词迷打开门。有向图存在欧拉图通路的充要条件是:图的基图连通,并且所有点的入度等于出度;或者除两个点外,其余点的入度等于出度,而这两个点中的一个点的出度与入度相差为1,另一原创 2011-07-16 14:26:13 · 296 阅读 · 0 评论 -
POJ2421 最小生成树/MST(prim)
题意:给出各个村的距离,并给出已经部分有路连通的两个村,求加最少的路的让各个连通。思路:让连通的边的权值设为零,然后求最小生成树即可。#include #include #include #include using原创 2011-07-30 10:26:39 · 380 阅读 · 0 评论 -
POJ 1149 最大流/max flow
题意: 有M个pighouse,每个pighouse里有一定数量的pig,Customer依次来买pig,并且他们每个人有某些pighouse的key,他们也只能买他们有key的pighouse里的pig,并且他们buy一定数里的pig,并且他们买完后可以重新分配打开的原创 2011-08-05 15:09:12 · 361 阅读 · 0 评论 -
POJ1949 拓朴排序
拓朴排序:(1)将入度为0的点入栈(2)while(!stack.empty()){node=stack.top();for(each currentnode与node有边){indegree[currentnode]--(入度减一)//POJ1949在这里保存currentnode完成的时间,当然是贪心记录最迟原创 2011-07-18 09:22:07 · 324 阅读 · 0 评论 -
POJ 2688 TSP问题
经典TSP问题先广搜求所有"dirty“点之前的距离,然后再DFS寻找所有组合(穷举法),最后取最短即为所求#include #include #include #include using namespace std;#define MAXN 30struct cnode{ int x; int y; int MapToPoint;// the in原创 2011-12-16 21:30:46 · 1196 阅读 · 0 评论 -
POJ 2607 SPFA
求出所有FireStation到其它的Intersection的距离,再求出基它Intersection到其它点的距离,然后比较距离就OK了用SPFA +AdjacencyList 的速度较快 用Dijkstra会超时题目测试数据:http://plg1.cs.uwaterloo.ca/~acm00/990925.data/#include原创 2012-01-09 21:36:13 · 396 阅读 · 0 评论 -
POJ3692 最大完全二分子图
1 、最大独立集+最小点覆盖=顶点数1、 最大独立集=顶点数-最大匹配数2、最大完美二分子图=补图的最大独立集3、独立集:表示集合里任意两边都没有连接关系4、补图的独立集(没有连接),反过来正是一个完全图原创 2011-01-30 12:07:00 · 740 阅读 · 0 评论 -
POJ1273(最大流)
#include//Edmonds-karp#includeusing namespace std;int INF;int main(){ memset(&INF,127,4); const int max=202; int flow[max][max]; int a[max]; int parents[max]; int capacity[max][max]; int f; int n,m; i原创 2011-01-04 10:22:00 · 429 阅读 · 0 评论 -
poj 2594(二分图最优匹配)
#include//0(n^4)最小权#includeusingnamespace std;structnode{int row;int column;}man[10002],home[10002];int row,column,NumMan,NumHome;int w[102][102],lx[102],ly[102],matchy[102];bool visitx[102],visity[102];booldfs(int u){int原创 2011-01-02 11:37:00 · 397 阅读 · 0 评论 -
floyd 算法(o(n*n*n)
#includeusing namespace std;int a[25][25];int main(){ int n,m,from,to,i,distan,j,k,sum; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i原创 2010-07-28 10:57:00 · 487 阅读 · 0 评论 -
DIJKSTRA算法(优先队列实现)(o(n*n))
DISJKSTRA是求最短路经的经典算法,这是求源点到其它所有顶点的距离。算法原理:集合Q(除源点),初始状态有所有的顶点。集合S,初始状态只有源点,初始状态将所有的点push入去最小优先(权优先)队列,循环取出点放进S(直到所有的点都放进S),然后每次对取出的点进行relaxation (松驰操作)。#include#include#includeusing namespace std;typedef pair pii;int INF=100000000 ;int a[100][100];bool d原创 2010-06-07 22:02:00 · 827 阅读 · 2 评论 -
用匈牙利算法求二分图的最大匹配
用匈牙利算法求二分图的最大匹配我很懒的 @ 2006-10-05 13:48什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识);第二种就是我现在要讲的匈牙利算法。这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率。匈牙利算法其实很简单,但是网上搜不到什么说得清楚的文章。所以我决定要写一下。最大流算法的核心问题就是找增广路径(augment pat转载 2010-08-23 22:55:00 · 543 阅读 · 0 评论 -
POJ 1244
<br />文章选自:http://ourbears.cn/OIBLOG/article.asp?id=12<br />什么叫最小路径覆盖?<br /><br /> 就是说,在当前的图上,找N条路径,让这N条路径覆盖图上所有的点,N的最小值就是我们要求的值。根据具体问题的不同,可分为一个顶点只能经过一次,和可以经过多次两类。<br /><br /> 最小路径覆盖的算法原理叙述如下:由于每条路径是一串点的序列,所以除了终点之外,每个点都有(不一定只有,这是我们等会要讨论的第二类问题。)转载 2010-08-28 13:49:00 · 411 阅读 · 0 评论 -
POJ 2594
这里的路径的点有重复现象,但最小路径覆盖的点不能重复。所以就借助重复的点传递。。。。。。(晕,不知怎么表达。。。。。。)#include//最小路径覆盖+传递闭包usingnamespace std;bool a[502][502];bool visity[502];int n,m;int matchingy[502];booldfs(int u){int v;for(v=1;v{if(visity[v]==false&&a[u][v]==tr原创 2010-08-28 23:11:00 · 345 阅读 · 0 评论 -
POJ 3020 (最小路径匹配)
一:最小路径覆盖 = |V| - 最大独立集 = |V| - 最大二分匹配(有向图) 二:因为构图过程中,匹配是双向的,即 和都算匹配,因此匹配数多了1倍,所以要除以2 (无向图:最小路径覆盖=|v|-最大二分匹配/2)原创 2010-08-28 22:27:00 · 309 阅读 · 0 评论 -
POJ 1325二分图,最小点覆盖
//二分图,最小点覆盖#includeusing namespace std;int map[102][102];bool visity[102];int visitx[102];int matchingy[102]; int n,m,k;bool dfs(int u) { int v; for(v=1;v { if(visity原创 2010-12-05 17:08:00 · 424 阅读 · 0 评论 -
POJ3613 经过K条边的最短路径 矩阵乘法 + floyd
以下选自:matrix67 十个利用矩阵乘法解决的经典问题经典题目8 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数modp的值 把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。类似地,C*A的第i行第j列就表示原创 2012-03-31 21:44:35 · 1744 阅读 · 0 评论