图论
北弑鸣狮
这个作者很懒,什么都没留下…
展开
-
图
图的表示 链式前向星: struct edge { int to; int w; int next; edge(){} edge(int a,int b,int c){to=a;w=b;next=c;} }; struct Map { int cnt; int head[maxn]; edge e[maxn<<1]; ...原创 2019-09-02 15:29:16 · 116 阅读 · 0 评论 -
并查集
并查集 (Union/Find)主要涉及两种基本操作:合并和查找。 基本操作位合并之后,为查找某两个元素是否已经处在同一个集合中,需要Find操作。 我们可以将并查集的元素看成是一个树,也可以看成是一个集合 int mset[maxn]; //初始化 void init() { for(int i=0;i<=15000;i++)mset[i]=i; } //find函数...原创 2019-09-02 15:26:42 · 123 阅读 · 0 评论 -
最大独立数
最大独立数即在二分图匹配中,选取最多的点,使任意所选两点均不相连。 我们可以看到,为了选取最多的点让任意两点都不相连,即在选取最大的匹配数基础上尽量多的选取不连接的点。 不妨设点数的总数为n,最大的匹配数必然是二分图中两两匹配,设为2m。 则剩下的没有匹配的点数为n-2m,这n-2m个点,很容易证明这n个点之间两两不相互连接,因为如果有连接,则可以将其选取为匹配。 故在已经匹配的二分图中,...原创 2019-09-02 15:28:21 · 366 阅读 · 0 评论 -
网络流
最大流: 最大流是网络流的一种,他表示从起始点s出发,引出无穷的流量,每条边上允许通过一个最大的流量,求最终能够到达目的地的最大流量是多少。 由于还是在图上进行操作,因此最大流的求解方法依然是基于dfs或者bfs的做法。故网络流比较耗费时间,常常所需要的点数不能够过大,大概在1k左右。 最大流的一般方法: 1.Ford_Fulkerson算法 从源点s开始,不断进行dfs遍历,寻找到一条...原创 2019-09-02 15:29:06 · 126 阅读 · 0 评论 -
最短路
图论中的经典问题,由一个点到另外一个点所经过的最短路径是多少。 BFS 对于每个边都相同的,可以统计从初始点到目标点经过的路径数量。 直接使用BFS即可 int dis[maxn]; queue<int> que; vector<int> e[maxn]; void bfs() { while(!que.empty())que.pop(); for...原创 2019-09-02 15:23:55 · 135 阅读 · 0 评论 -
MST(最小代价生成树)
生成树,即对图的dfs过程中,我们会得到一棵生成树,在所有不同的生成树中,会存在一些边上权值和最小的树,我们叫其最小代价生成树。 最小代价生成树常见算法有两种 prim (点少) bool vis[maxn]; int cost[maxn]; int prim(int u) { memset(vis,0,sizeof(vis)); for(int i=0;i<=n;...原创 2019-09-02 15:28:57 · 604 阅读 · 0 评论 -
匈牙利算法-最小点覆盖
点覆盖的概念定义: 对于图G=(V,E)中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中。 即存在这样一个集合s,集合中的点组成的行或者列的直线能够将目标点全部包含在s中。 最小点覆盖,即利用最少的行与列组成的直线数,使得目标点都包含在这些直线里面。 例如上图,最小值为2。 可以证明:最小点覆盖与二分图最大匹配数是共轭问题。即该问题可以用匈牙利算法计算最大匹配数。 二...原创 2019-09-02 15:28:15 · 426 阅读 · 0 评论 -
tarjan 连通性
tarjan处理强连通分量 利用tarjan处理,处理过程中每次遇到 dfn[rt]==low[rt],即为一个强连通块。获取color数组。 每个不同的color即表示该点属于第几个强连通分量。 vector<int> vec[maxn]; int tot; int dfn[maxn],low[maxn]; bool vis[maxn]; int color[maxn],cn...原创 2019-09-02 15:23:36 · 125 阅读 · 0 评论 -
图论
1.floyed求环 int n; int ans; ll a[maxn]; ll g[maxm][maxm],dist[maxm][maxm]; int main() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=inf; for(int i=1;i<=...原创 2019-08-19 21:16:53 · 83 阅读 · 0 评论