开始学图论辣

图的基本模型

图是点和边组成的集合体,G = <V, E>

v是点集,e是边集

还有就是有向图无向图啥的

算了太水了不写了

提几个没大见过的吧

环上任意两点间可以随意到达,自环就是一个点有一条连向自己的道路

路径

其实就是u-v的一条路,如果路径上的各顶点均不互相重复,称这样的路径为简单路径

特殊的图

上两点之间路径是唯一的,而且树一定有n个点n-1条边,保证所有点之间都可互相到达(无向图)

完全图指n个点之间任意两个点之间都有一条边(无向图)

竞赛图是完全图上的每一个边都随便定一个方向

基环树是说一个环上出去的点全是树

如果一条边只属于一个环,那么叫做仙人掌

图的输入方式

最常见的输入方式是用 1 − N 表示顶点,并逐行给出 M 条边所连接的两点和边权大小。

N M

u1 v1 w1

u2 v2 w2

. . .

um vm wm

如果有点权,一般会用一行 N 个数表示每个点的权值大小。

p1 p2 . . . pn

poj经常会给一些智障图的出法,比如告诉你一个点的出度是x,然后紧接着x个数表示u-vi有一条边。。。

还有一个变态输入方式

输入文件的第一行为n (n<=1000),表示火星上基地的数目。接下来的n-1行每行有一个正整数,其中文件第i行的正整数为a[i],表示从编号为i的基地到编号为a[i]的基地之间有一条道路,为了更加简洁的描述树状结构的基地群,有a[i]<i。

图的遍历方法

DFS和BFS

三种dfs序(在书上的)遍历方式

前序 中序 后序

例一

给定一个有向图,边权为 1 或 2,求单源最短路。

不能用任何最短路算法;

稍微改写一下 BFS 即可。

创建三个集合, Q0表示当前层, Q1 表示距离为 1 的层,Q2 表示距离为 2 的层,初始 Q0 = {s}, Q1 = ∅, Q2 = ∅

依次取出 Q0 中的点,将其邻点放入对应的 Q1 或 Q2 中

Q0 = Q1, Q1 = Q2, Q2 = ∅

注意一个点可能和当前层既有长度为 1 的边,又有长度为 2 的

边,应当将其加入 Q1 而非 Q2

例二

给出一个有向图和起点 s,对每条边 < u, v > 回答,如果删去这条边,从 s 到 v 的最短路长度是否会改变。

题解

求出从 s 出发的单源最短路

建立最短路图,即保留满足 dv du + 1 的边 < u, v >

在最短路图上,如果 v 的入度为 1,则该入边是从 s 到 v的必经边,若删去则 v 的最短路长度会改变

在最短路图上,如果 v 的入度大于 1,则删去任何一条入边, v 的最短路长度都不会改变

拓扑排序

有向无环图的拓扑排序即将所有顶点排为线性序列,使得对于任意的 < u, v >∈ E,都有 u 在线性序列中出现于 v 之前。

有向图中如果有环,则一定不存在拓扑排序;如果没有环,则一定存在拓扑排序。

选取一个入度为 0 的点记为 u

将 u 添加到线性序列末端

删去所有 u 的出边(如果有某个点入度为0,那么把他加进去)

重复上述步骤直到所有点都被加入序列

代码

void toposort()
{
queue<int> q;
for (int i = 1; i <= n; ++i)
if (in[i] == 0) //入度为0
q.push(i);
while (!q.empty())
{
int temp = q.front();
q.pop();
for (int i = head[temp]; i; i = edge[i].next)
{
int v = edge[i].to;
if (--in[v] == 0)
q.push(v);
}
}
}

例一(裸题)

有 n 项任务,有 m 个限制,第 i 个限制要求执行任务 ui 之前必须要完成任务 vi。请问是否存在合适的任务执行顺序,满足所有的限制。

实际上是u->v;

将每个任务视为一个点,任务之间的依赖构成了有向边。如果该有向图中没有环,则存在拓扑排序,而拓扑排序就是可行的任务执行顺序;如果该有向图中存在环,则无解。

注意如果长度不是n那么有环无解

bzoj 道路和航线

FJ 正在一个新的销售区域对他的牛奶销售方案进行调查。他想把牛奶送到 T 个城镇 (1 ≤ T ≤ 25000),编号为 1 到 T。这些城镇之间通过 R 条道路 (1 ≤ R ≤ 50000) 和 P 条航线(1 ≤ P ≤ 50000) 连接。每条道路 i 或者航线i 连接城镇 Ai 到Bi,花费为 Ci。

对于道路, 0 ≤ Ci ≤ 10000; 然而航线的花费很神奇,花费 Ci 可能是负数 (−10000 ≤ Ci ≤ 10000)。道路是双向

的,可以从 Ai 到 Bi,也可以从 Bi 到 Ai,花费都是 Ci。然而航线与之不同,只可以从 Ai 到 Bi。事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台了一些政策保证:如果有一条航线可

以从 Ai 到 Bi,那么保证不可能通过一些道路和航线从 Bi 回到

Ai。由于 FJ 的奶牛世界公认〸分给力,他需要运送奶牛到每一

个城镇。他想找到从发送中心城镇 S 把奶牛送到每个城镇的最

便宜的方案,或者知道这是不可能的。

有向边一定不在环中

注意到如果有一条航线可以从 Ai 到 Bi,那么保证不可能通过一

些道路和航线从 Bi 回到 Ai。

换言之,不存在包含航线(负权单向边)的环。

首先加入所有正权无向边,找出所有连通块,每个连通块缩为一

个点。再加入所有单向边,此时图一定为 DAG。

在 DAG 上用 BFS 更新最短路,在正权无向边组成的连通块

(缩点)内部使用 Dijkstra 更新最短路。

最短路

floyd

很水很水 基于DP,我们只需要枚举断点k就可以

void floyd()
{
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}

时间复杂度 O(N^3)

空间复杂度 O(N^2)

Dijkstra

速度最快的最短路算法,但是只适用于没有负权边的图

将所有点分为两个集合,最短路确定的集合 S 和最短路未确定的集合 T,初始 S = {s}

求 T 中每个点 v 的当前最短路

dv =  min<u, v> ∈E, u∈S{D_u + W_u, v}

取出 T 中 dv 最小的点,其最短路一定就是 dv,将其加入 S(就是这个地方比较慢)

不断重复上面的操作,直到所有点的最短路径都确定

朴素写法时间复杂度较劣,可以采用堆优化至 O((N + M)logN)

SPFA

Bellman-Ford 我就直接跳过了吧,SPFA其实就是队列优化的Bellman-Ford

从初始点开始找他所有的出边,如果某个点的距离被更新了,那么我们把这个点放到队列当中去,并且一直这么写。

void spfa()
{
for (int i = 1; i <= n; ++i)
{
dis[i] = inf;
vis[i] = 0;
}
dis[s] = 0;
vis[s] = 1;
q.push(s);
while (!q.empty())
{
int u = q.front();
q.pop(), vis[u] = 0;
for (int i = head[u]; i; i = edge[i].next) //
{
int v = edge[i].to;
if (dis[v] > dis[u] + edge[i].dis)
{
dis[v] = dis[u] + edge[i].dis;
if (!vis[v])
{
q.push(v);
vis[v] = 1;
}
}
}
}
}

D4下午的更多相关文章

  1. 搞了我一下午竟然是web.config少写了一个点

    Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...

  2. System.DateUtils 3. IsPM、IsAM 判断是否为上、下午

    编译版本:Delphi XE7 function IsPM(const AValue: TDateTime): Boolean; inline;function IsAM(const AValue: ...

  3. 用一个下午从零开始搭建一个基础lbs查询服务

    背景 现在做一个sns如果没有附近的功能,那就是残缺的.网上也有很多现成的lbs服务,封装的很完整了. 我首先用了下百度lbs云,但是有点不适合自己的需要,因此考虑用mongodb建一个简单的lbs服 ...

  4. 新蒂下午茶体基本版SentyTEA-Basic

    一.目前的最新版新蒂下午茶体包含了7600+常用汉字,每个字都是手写而成,是一套充满手写感的中文字体,轻松.惬意,如同慢饮一杯下午茶.SentyTEA-Basic.ttf  这个一个新蒂下午茶体基本版 ...

  5. JAVA判断当前时间是上午am还是下午pm

    //结果为"0"是上午 结果为"1"是下午 public class GregorianTest { public static void main(Strin ...

  6. PKUSC 模拟赛 day2 下午总结

    终于考完了,下午身体状况很不好,看来要锻炼身体了,不然以后ACM没准比赛到一半我就挂掉了 下午差点AK,有一道很简单的题我看错题面了所以没有A掉 第一题显然是非常丝薄的题目 我们很容易通过DP来O(n ...

  7. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  8. CTO俱乐部下午茶:技术团队管理中的那些事儿

    摘要:"CTO下午茶"是一种有效的集体对话的模式,参加活动的成员在真诚互动和共同学习的宗旨下齐聚一堂,在喝茶聊天氛围下交流工作心得.本期"CTO下午茶"的主题是 ...

  9. 6月27日CTO俱乐部下午茶印象

    作者:朱金灿 来源:http://blog.csdn.net/clever101 感谢CSDN的邀请,有幸参加了6月27日“CTO俱乐部下午茶时光:CTO在团队管理中所遇到的那些事”活动.本期的主讲嘉 ...

随机推荐

  1. JRebel最新破解激活版(IDEA自动部署插件)

    参考: https://www.52pojie.cn/thread-906163-1-1.html https://blog.csdn.net/xingbaozhen1210/article/deta ...

  2. Js 将图片的绝对路径转换为base64编码

    转.... 我们可以使用canvas.toDataURL的方法将图片的绝对路径转换为base64编码:在这我们引用的是淘宝首页一张图片如下:  var img = "https://img. ...

  3. 12、Nginx代理缓存服务

    通常情况下缓存是用来减少后端压力, 将压力尽可能的往前推, 减少后端压力,提高网站并发延时 1.缓存常见类型 服务端缓存 代理缓存, 获取服务端内容进行缓存 客户端浏览器缓存 Nginx代理缓存原理 ...

  4. 自定义Java Validator

    自定义Java Validator 在项目中,针对汉字的长度计算,数据库和java的计算方式不一致,需要重新处理下java 的 Validator,使其满足项目 建立自定义的 validator an ...

  5. NB-IOT双工模式

    半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输.例如,在一个局域网上使用具有半双工传输的技术,一个工作站可以在线上发送数据,然后立即在线上接收数据, ...

  6. mybaites 入门到精通

    这个mybatis教程也不错:http://limingnihao.iteye.com/blog/781671 MyBatis 目录(?)[-] mybatis实战教程mybatis in actio ...

  7. 【spoj 5971】lcmsum

    全场都 AK 了就我爆 0 了 题意 \(t\) 组询问,每组询问给定 \(n\),求 \(\sum\limits_{k=1}^n [n,k]\).其中 \([a,b]\) 表示 \(a\) 和 \( ...

  8. MyEclipse 2016 反编译插件安装

    下载插件,分享一下下载插件的地址,百度网盘:链接:http://pan.baidu.com/s/1nturiAH 密码:yk73 1.把net.sf.jadclipse_3.3.0.jar拷到D:\P ...

  9. vs code 保存显示无法写入文件的解决方法

    右键文件夹点击属性 选择安全 把当前用户权限都勾选上就可以了

  10. springboot jpa junit测试遇到的问题

    jpa在插入数据的时候,插入的对象变量user中不能包含变量,需要时确切的值,否则会出现sql解析报错 解析报错如下图