——图论
NOI_yzk
我爱oi oi爱我
展开
-
最小生成树模板——kruskal
kruskal算法int par[MAX_N];struct edge{int u,v,len;}e[MAX_M]; bool cmp(edge x,edge y){ return x.len<y.len; } int find(int x){return par[x]==x?x:par[x]=find(par[x]);} int Union(int x,int y){ x原创 2017-09-24 20:55:32 · 412 阅读 · 1 评论 -
航线规划(离线+路径压缩)
前言: 一般来说,树具有很多图的特性 所以遇到图论题一般要把它处理成树的题目这题的提示其实是很明显的 树上的每一条边算是都是关键路径 当添入一条边后它在树上所形成的环上的边就都不是关键路径分析数据可知每次询问不可能都把路径遍历一遍 那么为了使路径不被遍历多次,那么采用路径压缩的处理方式既然题目只删边而不加边 那么关键路径应是越来越多 但并不能很轻松地算出每次更新后产生的关键路径反一个方原创 2017-10-14 21:39:33 · 781 阅读 · 0 评论 -
bell-man
虽然现在更新有点迟了,但bellman还是一个值得学习的算法void relax(int u, int v, int weight) { if(dist[v]>dist[u]+weight) dist[v]=dist[u]+weight;}bool Bellman_Ford(){ for(int i=1;i<=n-1;i++) for(int j=原创 2017-10-13 20:54:14 · 703 阅读 · 0 评论 -
迪杰斯特拉
迪杰斯特拉是一个经典的图论算法 利用优先队列优化使复杂度由n*n优化到n*logmstruct SP{ int dis[M]; typedef pair<int,int> P; priority_queue<P,vector<P>,greater<P> >q; void dij(int x){ memset(dis,-1,sizeof(dis));原创 2017-10-03 16:19:11 · 341 阅读 · 0 评论 -
USACO安全路径
这题是道神题,虽然考试时并没有时间去看这道题目由于是牛i从牛棚1到牛棚i的路径是一样的 我们可以证明:可以生成一个最小路径树同时还可得出一个定理:使变化后的路径最优,那么最多添加一条边设我们添加一条长度为len,连接x和y的边 那么它会构成一个环,且这个环的其他点都存在与x与y到其最近公共祖先的路径上(设这个环上的点为a)。 这时到这些点的路径即可更新,新的路径为newdis[a]=dis[x原创 2017-10-03 08:31:05 · 455 阅读 · 0 评论 -
四点旅行
这题有两个思考点: 1.如何快速算出所有点的最短路 2.如何快速地找出那四个点由于边权为1,所以可以使用bfs直接找最短路,复杂度为n*n,比floyd快 分析数据可知,解法不能超过n*n 我们若枚举中间两个点,其实就可以贪心地算出这两个点分别对应的最远点 但可能会重复,其实解决方案很简单,只用记录离这个点最远,第二远,和第三远的点就好了FOR(i,1,n)bfs(i); FOR(原创 2017-10-08 16:24:24 · 353 阅读 · 1 评论 -
二分图最大匹配(匈牙利算法)
前言:二分图最大匹配其实就是二分匹配 利用了增广路的思想实现了点对间的一一配对 若想理解匈牙利算法可点击此链接代码实现是比较简单的,匈牙利算法在很多关于匹配的题目中有很灵活的运用(纯属博主瞎逼)代码实现如下:int link[M];bool vis[N];bool Look(int x){ for(int i=0;i<edge[x].size();i++){ int原创 2017-10-17 17:08:07 · 298 阅读 · 0 评论 -
欧拉回路与欧拉道路
欧拉回路与欧拉道路图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。 如果一个图只是形成一个连通所有节点的链,且每一点只走一次,则成为欧拉道路。 具有欧拉回路或欧拉道路的图称为欧拉图(简称E图)。 有向图的欧拉回路 一个有向图存在欧拉回路的前提条件是这个图是个连通图,其次要求其每个点的入度等于出度,或者其中有一个点的出度比入度大1,另一个点的入度比出度大一这样就存转载 2017-10-06 18:40:58 · 553 阅读 · 0 评论 -
图论——SPFA模板
SPFA是一种求最短路径的算法 SPFA的两种写法,bfs和dfs 判断有无负环: 如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图) bfs判别负环不稳定,相当于限深度搜索,但是设置得好的话还是没问题的, dfs的话判断负环很快下面贴出dfs判负环代码(只能判负环,不能求最短路(隔壁机房得出))//flag 是否有负环void DFS_SPFA(int u){原创 2017-09-28 16:08:19 · 337 阅读 · 0 评论 -
图论——寻找最短路径路线的两种算法
前言:关于找到最短路径上经过的边有两种方法 一种是从起点出发找一次最短路径,再从终点出发找一次最短路径 另一种是在找最短路径时标记下一个点 例题1:可怜的草坪 题目描述 小C的大学很大,从寝室到食堂要走很长一段路,很多的草坪位于这些路上。大家从寝室出发时,都喜欢从走最少的路达到食堂,哪些位于最短路上的草坪都要被踩踏,小C希望你帮他算算,有多少段草坪会经常被踩踏? 输入原创 2017-09-16 19:59:21 · 2975 阅读 · 0 评论 -
图论——最小生成树
最小生成树 首先,生成树是建立在无向图中的,对于有向图,则没有生成树的概念,所以接下来讨论的图均默认为无向图。对于一个有n个点的图,最少需要n-1条边使得这n个点联通,由这n-1条边组成的子图则称为原图的生成树。一般来说,一个图的生成树并不是唯一的(除非原图本身就是一棵树)。 现在考虑带权图G,即图的边带权,则最小生成树就是在G中权值和最小的一颗生成树,显然最小生成树也不是唯一的,但是其权值唯一转载 2017-09-24 20:42:08 · 1802 阅读 · 0 评论 -
Tarjan求强连通分量
强连通分量可以用Tarjan求 比两遍dfn大概快30%定义一个栈 把点压进去,然后根据自己所能到的点,求出能到达的dfn序最小的点 由此得到从此点到low点中的点(在栈中)可以成为一个强连通分量 具体实现是当x点满足dfn==low时,将栈中的点全部弹出至x点; 可以证明每个点最多被弹出1次,每条边最多被遍历一次 复杂度为O(n+m)O(n+m)int col[N],sz[N],cnt原创 2017-11-04 22:13:28 · 363 阅读 · 0 评论