
图论
哎呀呀呀呀呀呀
这个作者很懒,什么都没留下…
展开
-
图的建立,数组法建立邻接表
邻接表的建立函数 void addEdge( int u, int v ) { edge[e].v = v; edge[e].next = head[u]; head[u] = e++; }//因为head[i]中的i就是起点,所以结构体中可以不再记录起点 解释:head保存的是现在以u为起点的边,编号为head[i],遍历结束,最后head中保存的将是以u为起...原创 2018-05-19 15:53:41 · 640 阅读 · 0 评论 -
网络流(分割点,对点有限制,一个点最多进入多少流)
这样用普通的网络流有一种情况不能加以限制(如果限制C最多进15,但这样C有可能进25),将一个点拆分成两个点和一条路就可以加以限制这是替换之后的图像,加上了源点和汇点,这样可以通过c-C'的流量来限制进入C的流量典型的拆点求网络流题目,因为还要输出到底哪几个相连,通过看哪两个之间流量减少了ACM Computer FactoryAs you know, all the co...转载 2019-05-06 21:04:44 · 761 阅读 · 0 评论 -
二分匹配加速算法(简单,就是先把能匹配的先找出来,不用Hopcroft_Karp算法)
#include<bits/stdc++.h>using namespace std;int n,m;int INF=0x3f3f3f;int dis;int cx[3003];int dy[3002];int cy[3003];int dx[3003];int used[3002];int a[3003];int b[3002];int c[3002];i...原创 2019-04-29 19:53:28 · 459 阅读 · 0 评论 -
二分匹配(要注意的)
如果匹配有=0的情况 如girl[i]=0,一定要将girl初始化为-1,因此最好所有情况都初始化为-1原创 2019-04-24 10:45:41 · 151 阅读 · 0 评论 -
KM算法(求完全匹配中的权加和最高的问题,即两个集内的所有顶点能够一一匹配,并且所获得的权值最大或最小。)
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 305;const int INF = 0x3f3f3f3f;int love[MAXN][MAXN]; // 记录每个妹子和每个男生的好感度,记录边权int...转载 2019-04-27 16:46:10 · 605 阅读 · 0 评论 -
二分匹配Hopcroft-Carp算法
注意增广路的概念:匹配的点相连的路放入集合s,遍历未匹配的点(左集合),找一个与他相邻的点(右集合),若那个点也未匹配,则找到了增广路的终点。否则找那个对应的左集合里的点,然后走一条不属于s的路,循环直到找到一个右集合中未匹配的点为止,则从起点到终点为一条增广路。相当于走(不属于s的路-》属于-》不属于)这样一条交错路。最后将这条路与之前路的异或(取消相同的路),得到的一个新的s,这时匹配的数量会...原创 2019-04-26 10:59:36 · 529 阅读 · 0 评论 -
网络流(最大流)
网络流的相关定义:源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点。 汇点:另一个点也很特殊,只进不出,叫做汇点。 容量和流量:每条有向边上有两个量,容量和流量,从i到j的容量通常用c[i,j]表示,流量则通常是f[i,j].通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量。很显然的,流量<=容量。而对于每个不是源点和汇点的点...转载 2019-04-11 22:08:16 · 15258 阅读 · 3 评论 -
迪杰斯特拉代码部分及要注意的部分
#include<iostream>#include<cstdio>#include<string.h>#define inf 0x3f3f3fusing namespace std;void dijkstra();int p[101][101];int dis[101];int vis[101];int n,m;void init(){...原创 2018-08-03 11:54:09 · 224 阅读 · 0 评论 -
拓扑排序(可以用来看一个图中有没有环),有环的话加入队列的节点数不会等于总人数
需要输出排序后的顺序且要求编号有小到大或者由大到小排时要用优先队列否则用队列就可以不管什么队列,都应该首先把入度为0的点先加进去优先队列写法(要求同一层的还要排序就用优先队列)(把priority删掉就是队列写法,处在一层的元素有相同特征用队列,用优先会把相同特征弄混)hdu1258#include<iostream>#include<queue>...原创 2018-08-07 12:00:06 · 274 阅读 · 0 评论 -
求次小生成树(用prim)
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 111;const int inf = 0x3f3f3f3f;int Map[maxn][maxn];//邻接矩阵存图int Max[maxn][maxn];//表...转载 2018-06-02 10:51:13 · 301 阅读 · 0 评论 -
hdu 2544 迪杰斯特拉应用
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define INF 0x7fffffff #define maxn 105 using namespace std; ...转载 2018-06-07 17:30:16 · 166 阅读 · 0 评论 -
最短路迪杰斯特拉
#include <iostream> #include <malloc.h> #include <cstring> #include <stack> #include <cstdio> //定义邻接矩阵的大小 #define N 100 #define M 100 using namespac...转载 2018-06-07 17:12:08 · 190 阅读 · 0 评论 -
vector邻接表的建立(用vector的目的是因为不能确定每个点有几条边)
一。用结构体#include<stdio.h> #include<vector> #include<algorithm> #include<iostream>#include<algorithm>using namespace std; struct Edge{ int to; int cos...转载 2018-05-26 11:48:04 · 371 阅读 · 0 评论 -
拓扑排序算法
hdu1285 简单拓扑排序将有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。 最基本的拓扑概念。算法描述step1 :遍历图中每一个顶点...原创 2018-05-26 10:24:20 · 591 阅读 · 0 评论 -
HDU 1856 More is better 卡时间的并查集
#include<bits/stdc++.h>using namespace std;int father[10000005];int cal[10000005];void init();int find(int n);int main(){ int n; while(scanf("%d",&n)!=EOF) { int i; in...原创 2018-05-19 12:03:12 · 187 阅读 · 0 评论 -
floyd最小环(加输出路径)
#include<stdio.h>#include<string.h>#include<iostream>#include<map>#include<stack>using namespace std;map<string,int >s;map<int,string>re;int...转载 2019-05-09 21:27:00 · 248 阅读 · 0 评论