spfa算法(求最短路和判断是否存在负环)floyd求最短路(11/1)
1.快速排序 // 归并排序 模板(复习)高精度乘法/除法模板(高+低)前缀和(一维+二维)差分(一维+二维)模板(8/31)2.双指针(9/1 and9/2 )3.区间合并 (9/3)4. 复习知识,学习单链表数组实现 (9/4)5.数组模拟链表 模拟栈和队列 单调栈和队列(9/7 9/8)6.KMP算法 Trie树(9/9)7. 并查集 堆排序 模拟堆(9/10)8. 哈希表 知识速记(9/11 and 9/13)9.(续)哈希表 和 字符串哈希(9/15)10. STL (9/16)11.19号复习了二分 离散化复习 学习了DFS(9/20)12. dfs(排列数字 n皇后问题) (9/21)13.续 dfs 八皇后问题 (附练了一题dfs)(9/24)14.我汤姆回来了(树和图的深度优先遍历(树的重心))(10/11)15.求图的最短路问题(图的广度优先遍历) (10/12)16.拓扑排序(10/18)17.比赛经验(10/18)18.最短路(10/25)19. 最短路2 Bellman-ford算法 (10/31)
20.spfa算法(求最短路和判断是否存在负环)floyd求最短路(11/1)
21.最小生成树、二分图(11/2)22.最小生成树 kruscal算法(涉及并查集的应用)23.二分图 染色法 匈牙利算法(11/6 11/7)24.动态规划 背包问题25.动态规划(线性)26..计数类dp27.数段数组和线段树#include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=100010; int n,m; int h[N]; int ne[N];int e[N],w[N],idx=0; int dist[N]; bool st[N]; void add(int a,int b,int c) { ne[idx]=h[a];e[idx]=b;w[idx]=c;h[a]=idx++; } int spfa() { queue<int>q;//更新距离后的点就存起来,然后更新其邻接的点的距离 memset(dist,0x3f,sizeof dist); dist[1]=0; st[1]=true;//存的点标记,防止重复存 q.push(1); while(q.size()) { int t=q.front(); q.pop(); st[t]=false;//弹出后就不用标记了 for(int i=h[t];i!=-1;i=ne[i]) { int j=e[i]; if(dist[j]>dist[t]+w[i]) { dist[j]=dist[t]+w[i]; if(!st[j]) { q.push(j); st[j]=true;//注意存一个必须标记一个 } } } } return dist[n]; } int main() { memset(h,-1,sizeof h); scanf("%d%d",&n,&m); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); } int t=spfa(); if(t==0x3f3f3f3f) puts("impossible"); else printf("%d\n",t); return 0; }
判断是否存在负环
#include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=2010; const int M=100010; int n,m; int h[N]; int ne[M];int e[M],w[M],idx=0; int dist[N]; int cnt[N];//对边数进行计数 bool st[N]; void add(int a,int b,int c) { ne[idx]=h[a];e[idx]=b;w[idx]=c;h[a]=idx++; } bool spfa() { queue<int>q;//更新距离后的点就存起来,然后更新其邻接的点的距离 memset(dist,0x3f,sizeof dist); dist[1]=0; for(int i=1;i<=n;i++)//把每个点都进队列,因为不确定是不是第一个点经过负环,所以全部遍历 { q.push(i); st[i]=true; } while(q.size()) { int t=q.front(); q.pop(); st[t]=false;//弹出后就不用标记了 for(int i=h[t];i!=-1;i=ne[i]) { int j=e[i]; if(dist[j]>dist[t]+w[i]) { dist[j]=dist[t]+w[i]; cnt[j]=cnt[t]+1; if(cnt[j]>=n) return false; if(!st[j]) { q.push(j); st[j]=true;//注意存一个必须标记一个 } } } } return true; } int main() { memset(h,-1,sizeof h); scanf("%d%d",&n,&m); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); } if(spfa()) puts("No"); else puts("Yes"); return 0; }
floyd
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=210, INF=1e9; int d[N][N]; int n,m,Q; void floyd()//算法关键 { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } int main() { scanf("%d%d%d",&n,&m,&Q); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j) d[i][j]=0; else d[i][j]=INF; } while(m--) { int x,y,z; scanf("%d%d%d",&x,&y,&z); d[x][y]=min(d[x][y],z); } floyd(); while(Q--) { int a,b; scanf("%d%d",&a,&b); if(d[a][b]>=INF/2) puts("impossible");//可能存在负权边 else printf("%d\n",d[a][b]); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理