1.广搜:输出1号点到n号点的最短距离

#include <bits/stdc++.h>using namespace std;
const int N=100010;
int h[N],e[N],ne[N],idx;
int d[N];
int m,n;
void add(int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
int bfs()
{queue<int >q;memset(d,-1,sizeof(d));d[1]=0;q.push(1);while(q.size()){auto t=q.front();q.pop();for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(d[j]==-1){d[j]=d[t]+1;q.push(j);}}}return d[n];
}
int main()
{cin>>n>>m;memset(h,-1,sizeof(h));int a,b;for(int i=1;i<=m;i++){cin>>a>>b;add(a,b);}cout<<bfs()<<endl;return 0;
}

2.拓扑排序:输出任意一个拓扑序列

#include <bits/stdc++.h>using namespace std;
const int N=100010;
int h[N],e[N],ne[N],idx;
int d[N];
int n,m;
int qq[N];
void add(int a, int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}bool topu()
{queue<int >q;int k=0;for(int i=1;i<=n;i++){if(!d[i]){q.push(i);qq[k]=i;k++;}}while(q.size()){auto t=q.front();q.pop();for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];d[j]--;if(d[j]==0){q.push(j);qq[k]=j;k++;}}}return k==n;
}
int main()
{cin>>n>>m;memset(h,-1,sizeof(h));for(int i=1;i<=m;i++){int a,b;cin>>a>>b;add(a,b);d[b]++;}if(!topu()) puts("-1");else{for(int i=0;i<n;i++)printf("%d ",qq[i]);puts("");}return 0;
}

3.朴素迪杰斯特拉算法

#include <bits/stdc++.h>using namespace std;
const int N=510;
int n,m;
int g[N][N];//稠密图邻接矩阵
int dist[N];//1号点到当前点的距离
bool st[N];
int dijkstra()
{memset(dist,0x3f,sizeof dist);//初始化将每个点到1号点的距离设置成无穷大dist[1]=0;for(int i=0; i<n-1; i++) //将剩余n-1个点依次加入{int t=-1;for(int j=1; j<=n; j++) //在剩余点中寻找当前到1号距离最短的点if(!st[j]&&(t==-1||dist[t]>dist[j]))t=j;for(int j=1; j<=n; j++) //更新加入t点后的最短距离dist[j]=min(dist[j],dist[t]+g[t][j]);st[t]=true;}if(dist[n]== 0x3f3f3f3f)return -1;return dist[n];
}
int main()
{scanf("%d%d",&n,&m);memset(g,0x3f,sizeof g);while(m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);g[a][b]=min(g[a][b],c);//ab之间可能有多条路,保留最短的}printf("%d\n",dijkstra());return 0;
}

4.堆维护的迪杰斯特拉算法【优先队列】

#include <bits/stdc++.h>using namespace std;
typedef pair<int,int >PII;
const int N=1e6+10;//变成稀疏图,使用邻接表
int n,m;
int h[N],w[N],e[N],ne[N],idx;
int dist[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 dijkstra()
{memset(dist,0x3f,sizeof dist);dist[1]=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(dist[j]>dist[ver]+w[i]){dist[j]=dist[ver]+w[i];heap.push({dist[j],j});}}}if(dist[n]==0x3f3f3f3f) return -1;return dist[n];
}
int main()
{scanf("%d%d",&n,&m);memset(h,-1,sizeof h);while(m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c);}cout<<dijkstra()<<endl;return 0;
}

5.bellman_ford算法:解决负权边与边数限制的问题

#include <bits/stdc++.h>using namespace std;
const int N=510,M=10010;
struct Edge
{int a,b,c;
}edges[M];
int n,m,k;
int dist[N];
int backup[N];
void bellman_ford()
{memset(dist,0x3f,sizeof dist);dist[1]=0;for(int i=0;i<k;i++){memcpy(backup,dist,sizeof dist);for(int j=0;j<m;j++){auto e=edges[j];dist[e.b]=min(dist[e.b],backup[e.a]+e.c);}}
}
int main()
{cin>>n>>m>>k;for(int i=0;i<m;i++){int a,b,c;cin>>a>>b>>c;edges[i]={a,b,c};}bellman_ford();if(dist[n]>0x3f3f3f3f/2) puts("impossible");else printf("%d\n",dist[n]);return 0;
}

模板题——图论相关(1)相关推荐

  1. 图论-有向图的连通性模板题(hdu1296)(hdu1827)

    1.强连通分量: 强连通分量可以理解为边数最少的情况下是一个环. 这里写了一个模板题用的是tarjan算法,当然还有其他算法. tarjan算法的关键其实还是对于num数组和low数组的使用 然后可以 ...

  2. 一起开心2020暑假训练第二周 图论(模板题)

    比赛链接: 文章目录 A HDU 1285 一 B HDU 1863 起 C POJ 2387 开 D POJ 1502 心 E HDU 5922 图 F HDU 2112 论 A HDU 1285 ...

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

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

  4. 个人算法题精简导航整理(精炼汇总,含知识点、模板题、题单)

    文章目录 前言 导航 注意事项 技巧类 自定义Pair 排序 N维数组转一维 位运算 状态压缩 算法基础 枚举 √ 指数型枚举 排列型枚举 组合型枚举 左右区间枚举 模拟 √ 日期天数问题:平年闰年情 ...

  5. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  6. luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)

    luogu P4725 多项式对数函数 (模板题.FFT.多项式求逆.求导和积分) 手动博客搬家: 本文发表于20181125 13:25:03, 原地址https://blog.csdn.net/s ...

  7. 树的同构模板题(法1.最小表示法+法2.树哈希)

    树的同构 problem solution code solution code problem 模板题 solution Ⅰ. 最小表示法 将树转化为 0/10/10/1 括号序列:从根开始 dfs ...

  8. kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题)

    kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题) 总题单 week 3 [kuangbin带你飞] 题单 最小生成树 + 线段树 Cli ...

  9. 匈牙利算法——最大匹配问题详解(附模板题)

    基本概念转自  https://blog.csdn.net/dengheCSDN/article/details/77619308 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名. ...

  10. 完整答题小程序带流量主激励广告强点源码(答题小程序模板+题库)

    源码简介: ​答题小程序带流量主激励广告强点源码(答题小程序模板+题库),完整答题小程序源码有题库,无加密,带激励广告强制点击可提升广告收益.​ 下载链接 网盘源码   密码:3lev 背景 完整答题 ...

最新文章

  1. 数据、算法岗的几点经验分享!
  2. 深耕大数据市场,所问数据打造深度学习数据分析与预测引擎
  3. python语言能够整合各类程序代码-python语言概述
  4. 漫扯:从polling到Websocket(ZZ)
  5. 初谈逻辑读、物理读、预读
  6. 获取iOS 设备上崩溃日志 (Crash Log)的方法
  7. vs 中使用32 位mysql_vs2010连接mysql数据库(含win32和x64两种平台)
  8. Scale Match:国科大提出小目标检测的尺度匹配方法,用于预训练数据集处理
  9. FileFilter 遍历某个目录下文件名含有某个字符的文件
  10. 一款强大的cisco模拟配置、拓扑制作工具
  11. 让你做个《五子棋》怎么存储棋盘上的棋子信息?
  12. Crosses and Crosses
  13. Vscode,Open a folder or workspace…(File -> Open Folder)解决方案
  14. tp路由器虚拟服务器架设传奇,单机传奇架设教程2021年完整版
  15. 数据仓库系列4-维度表
  16. 基于因果逻辑库的定性事件结果及结果方向性预测
  17. 爬虫实战:链家租房数据爬取,实习僧网站数据爬取
  18. 论文推荐:陈国生 实证化中医基础理论
  19. JavaScript进阶(6)-全选练习
  20. [资源] Visual Studio 2015正式版离线iso及在线下载,附专业版和企业版可用key!

热门文章

  1. qnap自带有mysql吗_关于威联通QNAP NAS应用—Container Station 容器套件
  2. matlab电气常用工具箱,matlab电气工具箱实验指导书
  3. java两个数最大公约数和最小公倍数_java中请给出例子程序:找出两个数的最大公约数和最小公倍数...
  4. 计算机的分类按cpu芯片可以分为,按CPU芯片可分为单片机、单板机、多芯片机和多板机...
  5. python统计频数_python统计单词出现次数
  6. redis做几十万待办列表_用待办规划我的一天 | 指南 x 待办清单
  7. 小白Linux入门之:常用命令介绍
  8. ORB_SLAM2探秘 第一章
  9. 松灵机器人Scout代码分析 --- scout_ros
  10. 各种开源项目/库/工具介绍