图论

图的定义与概念

图的分类

图,根据点数和边数可分为三种:完全图,稠密图与稀疏图。

完全图,即\(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;
}

图论(最短路&最小生成树)的更多相关文章

  1. Day3 最短路 最小生成树 拓扑排序

    Day3 最短路 最小生成树 拓扑排序 (一)最短路 一.多源最短路 从任意点出发到任意点的最短路 1. Floyd \(O(n^3)\) for(int k=1;k<=n;k++) for(i ...

  2. python图论包networks(最短路,最小生成树带包)

    官方文档: https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.html 最短路和最小生成树: im ...

  3. HDU 5521 [图论][最短路][建图灵感]

    /* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...

  4. D1图论最短路专题

    第一题:poj3660 其实是Floyed算法的拓展:Floyd-Wareshall.初始时,若两头牛关系确定则fij = 1. 对于一头牛若确定的关系=n-1,这说明这头牛的排名是确定的. 通过寻找 ...

  5. 图论最短路——spfa

    今天开始图论的最短路的最后复习,今天自己手打spfa虽然看了一眼书,但是也算是自己打出来的,毕竟很久没打了,而且还是一遍a代码下来15min左右就搞完了,成就感++.所以呢来篇博客记录一下. 香甜的黄 ...

  6. 4144: [AMPPZ2014]Petrol (多源最短路+最小生成树+启发式合并)

    4144: [AMPPZ2014]Petrol Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 752  Solved: 298[Submit][Sta ...

  7. 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)

    Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...

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

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

  9. 洛谷:P1783 海滩防御(二分+并查集 最短路 最小生成树)

    题意: 给定长度为N的海滩,然后有M做防御塔,给出每座塔的位置Xi,到海岸的距离Yi. 求防御塔上最小观测半径Ri,使得海滩被封锁. 思路:要使左边界和右边界连通. 很nice,可以二分+并查集做. ...

随机推荐

  1. Xamarin 打包生成 Android apk 文件

    Visual Studio 支持 apk 发布 Xamarin.Forms项目或Xamarin.Android项目开发完成之后需要发布.比较常规的发布方式是生成 apk 文件,微软也考虑到开发者有发布 ...

  2. hadoop1.0 和 Hadoop 2.0 的区别

    1.Hadoop概述 在Google三篇大数据论文发表之后,Cloudera公司在这几篇论文的基础上,开发出了现在的Hadoop.但Hadoop开发出来也并非一帆风顺的,Hadoop1.0版本有诸多局 ...

  3. PJSUA2开发文档--第十一章 网络问题

    11 网络问题 11.1 IP地址更改 请参阅wiki 处理IP地址更改.请注意,本指南使用PJSUA API作为参考. 11.2 被阻止/过滤的网络 请参阅维基百科 通过阻止或过滤的VoIP网络

  4. 如何用git上传代码到github详细步骤

    注册账户 这个小菜鸟带着心跳写的第一篇博客! 还请大家多多提点! 想使用github,第一步肯定是要注册github账号,有了账号就是直接登录啦 可以直接打开http://github.com页面注册 ...

  5. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  6. win10 iis注册.net framework 此操作系统版本不支持此选项。

    利用dism工具 执行下面命令才成功 dism /online /enable-feature /featurename:IIS-ISAPIFilter dism /online /enable-fe ...

  7. C#生成JOSN字符串

    C#如何生成JSON字符串?(序列化对象)   第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象 ...

  8. CSS---内外边距

    1.内外边距含义 内边距是div边框内的距离.背景色会覆盖内边距,内边距会使宽高变大. 外边距是div边框外的距离.背景色不会覆盖外边距 内外边距都会撑高父元素,外边距会提高div与div之间的距离 ...

  9. laravel学习笔记二

    代码编写提示工具

  10. js倒计时、计时开始

    最近项目中用到倒计时与计时的功能,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...