图论基本概念

完全图: 每对顶点之间有边并且只有唯一的一条边.

强连通分量:有向图中任意2点都联通的最大子图.

图的储存

邻接矩阵:也就是一个二维数组,a[i][j]的值代表是否相连.

适用范围:

1.稠密图

2.无多重边

3.数据规模小

链式前向星:(模拟链表)

代码实现(主要部分)

 void add_eage(int from,int to,int  dis)
{
eage[++num].next=head[from];
eage[num].to=to;
eage[num].dis=dis;
head[from]=num;
}
割点&割边:

如果删去,那么原来联通的图就会变成2个或2个以上子图

判断割点:开一个low数组来记录i及i的子孙相连的最高的祖先的访问时间戳

low[u]=min(low[u],low[v]);

判断割边:当且仅当low[v]>dfn[u];

强连通分量Tarjan
 void tarjan(int i)//开始搜索...
{
int j;
dfn[i]=low[i]=++times;//记录时间戳
stak[++stp]=i;//压入栈
for(j=head[i];j;j=a[j].next)
{
int k=a[j].to;
if(!dfn[j])
{
tarjan(j);
if(low[j]<low[i]) low[i]=low[j];
}
else if(instak[j]&&dfn[j]<low[i]) low[i]=dfn[j];
}
if(dfn[i]==low[i])//判断改点是否为根节点
{
cnt++;//定义在最外面
do
{
j=stak[stop--];
instak[j]=false;
belong[j]=cnt;
}while(i!=j);
}
}
//cnt代表多少个强连通分量
最短路

1.Dijkstra:不含负权

思路:每次找到离源点最近的一个点进行扩展,最终得到源点到其余所有点的最短路径,不含负权

2.Bellman-ford:有负权,不含负权回路

这个就转变成对边的松弛

for(int i=; i<=n; i++)
   {
  int mindist = MAXINT;
  int u = v0;    // 找出当前未使用的点j的dist[j]最小值
   for(int j=; j<=n; ++j)
   if((!S[j]) && dist[j]<mindist)
   {
   u = j; // u保存当前邻接点中距离最小的点的号码
    mindist = dist[j];
   }
  S[u] = true;
  for(int j=; j<=n; j++)
   if((!S[j]) && A[u][j]<MAXINT)
   {
   if(dist[u] + A[u][j] < dist[j]) //在通过新加入的u点路径找到离v0点更短的路径
   {
  dist[j] = dist[u] + A[u][j]; //更新dist
  prev[j] = u; //记录前驱顶点
   }
   }
  }

3.SPFA:kuai

  while (!Q.empty())
{
int u = Q.front();
Q.pop();
visited[u] = ;
for (int v = ; v < vertex_num; v++)
{
if (matrix[u][v] != INT_MAX) //u与v直接邻接
{
if (dist[u] + matrix[u][v] < dist[v])
{
dist[v] = dist[u] + matrix[u][v];
path[v] = u;
if (!visited[v])
{
Q.push(v);
enqueue_num[v]++;
if (enqueue_num[v] >= vertex_num)
return false;
visited[v] = ;
}
}
}
}
}

最小生成树太简单了

图论的复习/(ㄒoㄒ)/的更多相关文章

  1. NOIP2018考前抱佛脚——图论基础复习

    目录 存图方式 邻接矩阵存图 邻接表存图 链式前向星 最小生成树 例1 P1536 村村通 题目描述 输入输出格式 输入输出样例 标程 例2 P1546 最短网络 Agri-Net 题目背景 题目描述 ...

  2. [SinGuLaRiTy] 图论题目复习

    [SInGuLaRiTy-1027] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [Vijos 1423] 最佳路线 题目描述 年久失修的 ...

  3. [vijos P1626] 爱在心中

    做完Victoria的舞会3,挑了vijos里强连通分量里面难度值最低的题目,也就是这道.先把第一小问做了,纯Tarjan,只是我学的时候的标程是用邻接表的,这题数据小于是用了邻接矩阵,两者之间的切换 ...

  4. SCOI2014省选总结

    这一次省选,主要是抱着玩的心态去的,如同高二的那些大神高一的心态一样,只记得在省选之前我们一直在说,这一次我们的目标,就是不爆0,最后也如愿以偿的实现了. 首先,请允许我吐槽一下day1.....da ...

  5. ZOJ3229 Shoot the Bullet [未AC]

    Time Limit: 2 Seconds      Memory Limit: 32768 KB      Special Judge Gensokyo is a world which exist ...

  6. JML契约式设计——第三单元学习小结

    一.前言 本单元作业都是关于JML(Java Modeling Language),JML是一种契约式设计(Design by Contract)的语言,契约式设计的主要目的是希望程序员能够在设计程序 ...

  7. NOIP专题复习1 图论-最短路

    一.知识概述 今天我们要复习的内容是图论中的最短路算法,我们在这里讲3种最短路求法,分别是:floyd,dijkstra,spfa. 那么我们从几道例题来切入今天讲解的算法. 二.典型例题 1.热浪 ...

  8. NOIP专题复习3 图论-强连通分量

    目录 一.知识概述 二.典型例题 1.[HAOI2006]受欢迎的牛 2.校园网络[[USACO]Network of Schools加强版] 三.算法分析 (一)Tarjan算法 (二)解决问题 四 ...

  9. [SinGuLaRiTy] 复习模板-图论

    [SinGuLaRiTy-1041] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 计算树的直径 //方法:任选一个点作为起点进行一次BFS ...

随机推荐

  1. Linux上Makefile管理java项目

    前面文章讲到了Linux上通过.spec文件与rpmbuild命令将java程序打包为RPM安装包, 现阶段遇到新的需求: 使用Makefile来操纵java的编译.打包 该需求以前面的内容为基础 可 ...

  2. 国际电话区号SQL

    CREATE TABLE `phone_prefix` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `country` varchar(30) N ...

  3. CSP201312-1:出现次数最多的数

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的“计算机职业资格认证”考试,针对计算机软件开发. ...

  4. 切换pip源的简便方法

    网上大部分帖子讲的都是打开配置文件修改,那样太麻烦了,其实只要一行命令搞定: pip config set global.index-url https://pypi.tuna.tsinghua.ed ...

  5. %matplotlib inline

    整理摘自 https://zhidao.baidu.com/question/1387744870700677180.html %matplotlib inline是jupyter notebook里 ...

  6. MySql动态生成SQL并执行

    场景:由于一些表中设计了一些冗余字段,因此在主表修改了该冗余字段的值得时候,需要动态更新在其他表中冗余字段的值 BEGIN #Routine body goes here... /*SQL语句变量*/ ...

  7. Mac上基于hexo+GitHub搭建个人博客(一)

    原文地址: http://fanjiajia.cn/2018/11/23/Mac%E4%B8%8A%E5%9F%BA%E4%BA%8Ehexo+GitHub%E6%90%AD%E5%BB%BA%E4% ...

  8. C#程序中SQL语句作为函数参数形式问题

    今天遇到一个神奇现象,目前正在写一个Demo,人事管理系统,首先肯定是初始化主页面,在初始化时,需要声明一个登陆窗体,但是当我在登陆窗体中填入登入名称和密码时直接就登陆成功了,但是发现我的status ...

  9. java线程(3)——详解Callable、Future和FutureTask

    回顾: 接上篇博客 java线程--三种创建线程的方式,这篇博客主要介绍第三种方式Callable和Future.比较继承Thread类和实现Runnable接口,接口更加灵活,使用更广泛.但这两种方 ...

  10. SQL select 和SQL where语句

    一.SQL SELECT语句 用于从表中选取数据,结果被存储在一共结果表中(称为结果集) 1.语法: SELECT 列名称   FROM  表名称 以及: SELECT * FROM 表名称 注:SQ ...