图论(最短路&最小生成树)
图论
图的定义与概念
图的分类
图,根据点数和边数可分为三种:完全图,稠密图与稀疏图。
完全图,即\(m=n^2\)的图\((m\)为边数,\(n\)为点数\()\)。如:
1 1 0
1 2 1
1 3 2
2 1 1
2 2 0
2 3 3
3 1 2
3 2 3
3 3 0
这个数据是一个完全图。
稠密图,即\(m\)十分接近于\(n^2\)的图。如:
1 1 0
1 2 1
1 3 2
2 1 1
2 2 0
2 3 3
3 1 2
这个数据是一个稠密图。
稀疏图,即\(m\)远远低于\(n^2\)的图。如:
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5
这个数据是一个稀疏图。
根据方向可分为两种:有向图和无向图。
有向图,就是边有方向,比如说,\(1\)$2$有一条边,而$2$\(1\)没有边,则只能从\(1\)前往\(2\),不能从\(2\)前往\(1\),类似于现实中的单行道。
无向图,就是边无方向,比如说,\(1\)$2$有一条边,而$2$\(1\)没有边,则可以从\(1\)前往\(2\),也可以从\(2\)前往\(1\),类似于现实中的双行道。
图的边权
就类似于现实中路的长度。
图大概长这样:

图的存储
邻接矩阵
适用于\(n \le 10000\)。
\(Code:\)
int dis[n][n];
int inf=99999999;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)dis[i][j]=inf;
cin>>u>>v>>w;
dis[u][v]=w;
邻接矩阵,就是用矩阵来存储图,\(dis[i][j]\)即代表\(i\)~\(j\)的最短路径。如一个有向图:
1 1 0
1 2 1
1 3 2
2 1 1
2 2 0
2 3 3
3 1 2
这个数据用邻接表存储是这样的:
| \(dis\) | \(1\) | \(2\) | \(3\) |
|---|---|---|---|
| \(1\) | 0 |
1 |
2 |
| \(2\) | 1 |
0 |
3 |
| \(3\) | 2 |
inf |
0 |
边表
适用于所有情况。
struct edge
{
int u,v,w;
}e[m];
...
cin>>u>>v>>w;
e[cnt]={(edge)u,v,w};
邻接表
适用于所有情况。
int u[m],v[m],w[m],next[2*m],first[m];
...
cin>>u[cnt]>>v[cnt]>>w[cnt];
next[cnt]=first[u[cnt]];
first[u[cnt]]=cnt;
图的最短路
\(dijkstra(\)堆优化\()\)
时间复杂度:\(O((m+n)\) \(log\) \(n)\)
使用邻接表。
void dijkstra(int i)
{
for(int j=0;j<=n;j++)
dis[j]=inf;
dis[i]=0;
memset(book,false,sizeof(book));
priority_queue<pair<int,int>>q;
q.push(make_pair(0,i));
while(q.size())
{
int x=q.top().second;
q.pop();
if(book[x])continue;
book[x]=true;
for(int k=first[x];k;k=next[k])
{
if(dis[v[k]]>dis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
q.push(make_pair(-dis[v[k]],v[k]));
}
}
}
}
\(SPFA\)
时间复杂度:\(O(\)玄\()\)。
使用邻接表\(/\)边表。
void spfa(int i)
{
for(int j=0;j<=n;j++)
dis[j]=inf;
dis[i]=0;
memset(book,false,sizeof(book));
queue<int>q;
q.push(i);
book[i]=true;
while(!q.empty())
{
int k=first[q.front()];
while(k!=-1)
{
if(dis[v[k]]>dis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==false)
{
q.push(v[k]);
book[v[k]]=true;
}
}
k=next[k];
}
book[q.front()]=false;
q.pop();
}
}
\(Floyd\)
时间复杂度:\(O(n^3)\)
使用邻接矩阵。
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
图的最小生成树
图的最小生成树指,权值和最小的生成树。
struct edge
{
int u,v,w;
}e[3240010];
struct bcj
{
int father[1810];
void start(int n)
{for(int i=0;i<=n;i++)father[i]=i;}
int find(int x)
{if(father[x]!=x)father[x]=find(father[x]);return father[x];}
void unionn(int x,int y)
{x=find(x);y=find(y);if(x!=y)father[y]=x;}
bool judge(int x,int y)
{if(find(x)==find(y))return true;return false;}
};
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
...
sort(e+1,e+1+m,cmp);
uf.start(n);
for(int i=1;i<=m;i++)
{
if(!uf.judge(e[i].u,e[i].v))
{
cnt++;
ans+=e[i].w;
uf.unionn(e[i].u,e[i].v);
}
if(cnt==n-1)break;
}
图论(最短路&最小生成树)的更多相关文章
- Day3 最短路 最小生成树 拓扑排序
Day3 最短路 最小生成树 拓扑排序 (一)最短路 一.多源最短路 从任意点出发到任意点的最短路 1. Floyd \(O(n^3)\) for(int k=1;k<=n;k++) for(i ...
- python图论包networks(最短路,最小生成树带包)
官方文档: https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.html 最短路和最小生成树: im ...
- HDU 5521 [图论][最短路][建图灵感]
/* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...
- D1图论最短路专题
第一题:poj3660 其实是Floyed算法的拓展:Floyd-Wareshall.初始时,若两头牛关系确定则fij = 1. 对于一头牛若确定的关系=n-1,这说明这头牛的排名是确定的. 通过寻找 ...
- 图论最短路——spfa
今天开始图论的最短路的最后复习,今天自己手打spfa虽然看了一眼书,但是也算是自己打出来的,毕竟很久没打了,而且还是一遍a代码下来15min左右就搞完了,成就感++.所以呢来篇博客记录一下. 香甜的黄 ...
- 4144: [AMPPZ2014]Petrol (多源最短路+最小生成树+启发式合并)
4144: [AMPPZ2014]Petrol Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 752 Solved: 298[Submit][Sta ...
- 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)
Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...
- NOIP专题复习1 图论-最短路
一.知识概述 今天我们要复习的内容是图论中的最短路算法,我们在这里讲3种最短路求法,分别是:floyd,dijkstra,spfa. 那么我们从几道例题来切入今天讲解的算法. 二.典型例题 1.热浪 ...
- 洛谷:P1783 海滩防御(二分+并查集 最短路 最小生成树)
题意: 给定长度为N的海滩,然后有M做防御塔,给出每座塔的位置Xi,到海岸的距离Yi. 求防御塔上最小观测半径Ri,使得海滩被封锁. 思路:要使左边界和右边界连通. 很nice,可以二分+并查集做. ...
随机推荐
- .NET下对Web.config与App.Config的增删改操作的代码
把代码过程常用的内容做个收藏,下边代码段是关于 .NET下对Web.config与App.Config的增删改操作的代码. <?xml version="1.0" encod ...
- Xutils, OKhttp, Volley, Retrofit对比
Xutils这个框架非常全面,可以进行网络请求,可以进行图片加载处理,可以数据储存,还可以对view进行注解,使用这个框架非常方便,但是缺点也是非常明显的,使用这个项目,会导致项目对这个框架依赖非常的 ...
- c++模板特化偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你对某一功能有更好地实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是模板如 ...
- typora快捷键
目录 基础信息 常用快捷键 修改快捷键 基础信息 typora是一款极佳的markdown写作软件,编辑和预览两者合二为一,免费良心软件,推荐使用. 官网:https://www.typora.io/ ...
- jsp 简单下载
<%@ page language="java" import="java.util.*" contentType="text/html;cha ...
- vmware station-ubuntu18.04 共享剪贴板
辞职在家休息,买了台新电脑,装个虚拟机,安装visual studio, android studio, qt, everything, noptepad++,hbuilder,ditto,xx-ne ...
- 一探究竟:Namenode、SecondaryNamenode、NamenodeHA关系
NameNode与Secondary NameNode 很多人都认为,Secondary NameNode是NameNode的备份,是为了防止NameNode的单点失败的,其实并不是在这样.文章Sec ...
- linux 网卡的混杂模式的取消
1.Linux下网卡常用的几种模式说明: 广播方式:该模式下的网卡能够接收网络中的广播信息. 组播方式:设置在该模式下的网卡能够接收组播数据. 直接方式:在这种模式下,只有目的网卡才能接收该数据. 混 ...
- zabbix 主动模式和被动模式说名
一.zabbix agent主动模式与被动模式的区别 zabbix agent的运行模式有以下两种:1.被动模式:此模式为zabbix默认的工作模式,由zabbix server 向zabbix ag ...
- yafu安装使用方法以及mismatched parens解决方法
yafu用于自动整数因式分解,在RSA中,当p.q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p.q值,原理是使用Fermat方法与Pollard rho方法等. 再摘录官方的一 ...