基本知识

Dijkstra基本思想
拓扑排序思维视频讲解

848:有向图的拓扑排序

题目链接
题解:

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m;
int h[N],e[N],ne[N],idx;
int d[N];//d[j]代表点j的入度数量
int q[N];//用数组模拟队列,避免queue中的pop,保留元素
void add(int a,int b)//建立邻接表存储图
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
bool topsort()//模拟队列,判断是否为有向无环图
{int hh=0,tt=-1;//队头,队尾 for(int i=1;i<=n;i++){if(!d[i]) q[ ++tt ] = i ;//将入度为0的点入队 }while(tt>=hh){int t=q[hh++];for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(--d[j]==0){q[++tt]=j;}}}return tt==n-1;//表示n个点都入队了,则为有向无环图,即拓扑图
}
int main()
{cin>>n>>m;memset(h,-1,sizeof h);for(int i=0;i<m;i++){int a,b;cin>>a>>b;add(a,b);d[b]++;}if(topsort()){for(int i=0;i<n;i++) cout<<q[i]<<" ";}else{cout<<-1;}return 0;
}

849:Dijkstra求最短路I – 朴素实现

题目
题解:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=510;
int dis[N],pic[N][N];
bool st[N];//标记该点的最短距离是否已经被确定
//未优化版本
int main()
{int n,m;cin>>n>>m;memset(pic,0x3f,sizeof(pic));for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;pic[u][v]=min(pic[u][v],w);//对于重边的处理 }memset(dis,0x3f,sizeof(dis));dis[1]=0;//到自身距离为0 for(int i=1;i<=n;i++)//有n个点所以n次迭代 {int t=-1;//t用于储存当前被访问的点 for(int j=1;j<=n;j++){//改不走寻找还未确定的最短路的点当中 路径最短的点 if(!st[j]&&(t==-1||dis[t]>dis[j]))t=j;}st[t]=1;//到t点的最短路已经确定 for(int j=1;j<=n;j++)//依次更新每个点到相邻的点的最短路<--新确定的最短路的点会影响未确定的点 dis[j]=min(dis[j],dis[t]+pic[t][j]);}if(dis[n]==0x3f3f3f3f) cout<<-1<<endl;//到n点没有路径 else cout<<dis[n];return 0;
}

850. Dijkstra求最短路 II – 优化

题目
题解:面对数据较大情况(点的数量超过1e5,不再适合用二维数组存,二维数组开到1e5会爆),使用优先队列优化,使用临界矩阵存图(适用于稀疏图)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
typedef pair<int, int> pii;
int dis[N];
int h[N],e[N],ne[N],idx;
int w[N];//存权重
bool st[N];//标记该点的最短距离是否已经被确定
//优化版本,用邻接矩阵存图
void add(int a,int b,int c)
{e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}
int main()
{int n,m;cin>>n>>m;memset(h,-1,sizeof(h));for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;add(u,v,w); }memset(dis,0x3f,sizeof(dis));dis[1]=0;//到自身距离为0 priority_queue<pii, vector<pii>, greater<pii> >heap;heap.push({0,1});//先存距离,再存点while(heap.size()){auto t=heap.top();heap.pop();int ver=t.second,distance= t.first;if(st[ver]) continue;st[ver]=true;for(int i=h[ver];i!=-1;i=ne[i]){int j=e[i];if(dis[j]>dis[ver]+w[i]){dis[j]=dis[ver]+w[i];heap.push({dis[j],j});}}}if(dis[n]==0x3f3f3f3f) cout<<-1<<endl;//到n点没有路径 else cout<<dis[n];return 0;
}

P4779 【模板】单源最短路径(标准版)

题目
上述Dijkstra都是寻找从1到n的最短路,本题寻找从第s个点出发,到每个点的距离
题解:

#include<bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=1e5+10;
int n,m,s;
ll dis[N];
bool vis[N];
struct node
{int to,len;
};
vector<node> f[N];
void diji(int t)
{memset(dis,inf,sizeof(dis));memset(vis,0,sizeof(vis));dis[t]=0;//注意初始化priority_queue<pii, vector<pii>, greater<pii> >q;q.push(pii(0,t));//从第t个点开始的精髓于此while(!q.empty()){pii p=q.top();q.pop();int tt=p.second;if(vis[tt]) continue;vis[tt]=true;for (int i=0;i<f[tt].size();i++){node a=f[tt][i];if(dis[a.to]>dis[tt]+a.len){dis[a.to]=dis[tt]+a.len;q.push(pii(dis[a.to],a.to));}}}
}
int main()
{cin>>n>>m>>s;for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;f[u].push_back({v,w});}diji(s);for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
}

总结

今天是学习图论第一天…加油,道阻且长…

图论入门(一),拓扑排序生成拓扑序列与Dijkstra求最短路相关推荐

  1. 拓扑排序之变量序列代码

    /* Name:  Copyright:  Author:  Date: 17-11-14 21:02 Description: 拓扑排序之变量序列  如果有n个变量(1<=n<=26,变 ...

  2. AOV网络、拓扑排序、拓扑序列

    AOV网络 AOV网是有向图的一类应用,在AOV网中,用顶点表示某个有一定规模的"工程"里的不同活动,用图中的边表示各项活动之间的先后顺序关系.一种常见的AOV网实例是大学课程的先 ...

  3. python 拓扑排序_拓扑排序(topsort)算法详解

    在图论中,由某个集合上的偏序得到全序的策略就是拓补排序算法.拓扑排序常出现在涉及偏序关系的问题中,例如时序的先后.事物的依赖等.针对这些问题拓扑排序通常能有效地给出可行解. 为了便于理解,我们先来看一 ...

  4. python 拓扑排序_Python 拓扑排序

    Python 拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G) ...

  5. 图综合练习--拓扑排序_拓扑排序

    一个场景 在大学里,每当到了期末的时候,你一定会头疼于选课给你带来的困扰.其中一项就是先修课的问题,每次你高高兴兴地选了自己心仪的选修课时,却发现自己不满足先修课的要求,只好默默地退掉.到底怎样安排我 ...

  6. Bailian4084 拓扑排序【拓扑排序】

    4084:拓扑排序 总时间限制: 1000ms 内存限制: 65536kB 描述 给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前. 输入 若干行整数,第一行有2个数,分别为顶 ...

  7. 拓扑排序(Kahn算法和基于DFS求解法)

    拓扑排序是对有向无环图(DAG)进行排序,从而找到一个序列.该序列满足对于任意一对不同的顶点u,v∈V,若G中存在一条从u->v的边,则在此序列中u在v前面. 拓扑排序也可以用来判断一个有向图是 ...

  8. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  9. ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)

    模板 时间复杂是 O(n2+m), n表示点数,m 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存 ...

最新文章

  1. 读取手机联系人,并用listview显示
  2. 好用的 Abyss Web Server
  3. 从 volatile 说到 i++ 的线程安全问题
  4. ChineseDiachronicCorpus项目,大规模中文历时语料库
  5. 综述 | 知识图谱(Knowledge graph)链路预测(Link Prediction)
  6. 95-235-065-源码-task-SourceStreamTask
  7. 详解电脑换主板需要重装系统吗
  8. flex blazeds java_flex blazeds连接java
  9. 菜鸟教程 Python100例答案
  10. 网络看不到计算机和设备,网络发现已关闭,网络计算机和设备不可见。请启用网络和共享中心中的网络发现。解决方法...
  11. 【RabbitMQ】SpringBoot的RabbitMQTemplate实战
  12. redis集群和redis宕机处理方案
  13. windows常用系统命令
  14. 华北电力大学控制与计算机工程学院怎么样,华北电力大学控制与计算机工程学院实践部10月25日动保劳动感想...
  15. Typescript 类型推断
  16. 高德地图精确定位和获取地理位置
  17. 百度地图API 学习网站
  18. 小新air 13 pro更换固态硬盘
  19. 从工地打工,到狂揽10个大厂offer、副业赚100万:培训班出来的程序员是怎么做到的?
  20. ARM如何判断合法的立即数

热门文章

  1. 达梦数据库监控-DEM 部署
  2. IT项目管理那些事儿读书笔记
  3. 做游戏建模,想知道免费3D模型哪里找?这8个网站不可少
  4. java中Date计算时间差
  5. [网络安全课程实验]:PGP加密解密
  6. Django_使用class写views
  7. 今年底出版《算法竞赛》,这是大纲
  8. 程序员六大不良习惯 看看你有啥职业毛病 ~
  9. 十年弄潮 ——从《才富》到《中国人力知本》
  10. Linux 常用命令 一顿操作猛如虎