[模板]Dijkstra, Prime, Bellmanford, Floyed算法模板
来源:互联网 发布:大学生简历 知乎 编辑:程序博客网 时间:2024/04/28 13:34
Dijkstra算法
/*8 154 5 0.355 4 0.354 7 0.375 7 0.287 5 0.285 1 0.320 4 0.380 2 0.267 3 0.391 3 0.292 7 0.346 2 0.403 6 0.526 0 0.586 4 0.93*/#include<bits/stdc++.h>#include<vector>#define N 107#define INF 0x3f3f3fusing namespace std;struct Node{ int v; double w; Node(){} Node(int v,double w):v(v),w(w){}};double dist[N];int visit[N];int path[N];int m,n;vector<Node> G[N];void input(){ cin>>n>>m; int a,b; double w; for(int i=0;i<m;i++){ cin>>a>>b>>w; G[a].push_back(Node(b,w)); }}struct Point{ double w; int id; Point(double w,int id):id(id),w(w){} Point(){} bool operator<(const Point n)const{ return w>n.w; }};void Dijkstra(int s){ for(int i=0;i<n;i++)dist[i]=INF; memset(visit,0,sizeof(visit)); priority_queue<Point> q; q.push(Point(0,s)); dist[s]=0; while(q.empty()==false){ double w=q.top().w; int id=q.top().id; q.pop(); visit[id]=true; for(int i=0;i<G[id].size();i++){ int adj=G[id][i].v; double value=G[id][i].w; if(dist[id]+value<dist[adj]){ dist[adj] = dist[id]+value; if(visit[adj]==true)continue; q.push(Point(dist[adj],adj)); } } } for(int i=0;i<n;i++){ cout<<dist[i]<<endl; }}int main(){ freopen("Dijkstrain.txt","r",stdin); input(); Dijkstra(0);}
Prime算法
#include <bits/stdc++.h>using namespace std;#define N 1007struct Edge{ int e; double w; Edge(int e,double w):e(e),w(w){} Edge(){}};//类似邻接表的方式存放图struct Node{//存放在队列之中,实际上是一条边 int b,e; double w; Node(int b,int e,double w):b(b),e(e),w(w){} Node(){} bool operator <(const Node&rhs)const{ return w>rhs.w;//重载<运算符,优先队列最小的值优先 }};vector<Edge> a[N];bool mark[N];//标记这一个点,是不是已经加入到最小生成树中了int n,m;priority_queue<Node> q;void Input(){ memset(mark,0,sizeof(mark)); cin>>n>>m; int b,e; double w; for(int i=0;i<m;i++){ cin>>b>>e>>w; a[b].push_back(Edge(e,w)); a[e].push_back(Edge(b,w));//注意无向边的输入是两个方向的 }}void visit(int u){ mark[u]=true; for(auto &mem:a[u]){ if(mark[mem.e]==false){//将和这个定点相关的边加入到队列中,但是跳过已经在队列中的点 q.push(Node(u,mem.e,mem.w)); } }}double Prime_lazy(){ double ans=0; visit(0); while(q.size()!=0){ auto top=q.top(); q.pop(); if(mark[top.b]&&mark[top.e])continue;//跳过无效的边 ans+=top.w; if(mark[top.b]==false){ visit(top.b); } if(mark[top.e]==false){ visit(top.e); } } return ans;}int main(){ freopen("prime_in.txt","r",stdin); Input(); cout<<Prime_lazy()<<endl;}
Bellmanford算法
#include <stdio.h>#include<iostream>using namespace std;#define INF 0xffffff //无穷大#define N 500000//定点个数最大值#define M 500000//边的个数的最大值int m,n;//边的个数struct Edge{ int b,e; double w; Edge(){} Edge(int b_,int e_,double w_){ b=b_,e=e_,w=w_; }};Edge a[M];int dist[N];bool Bell_ford_edge(int v0){ for(int i=0;i<n;i++){ dist[i]=INF; }dist[v0]=0; for(int k=0;k<=n;k++){ for(int i=0;i<m;i++){ Edge tmp=a[i]; if(dist[tmp.b]!=INF && dist[tmp.b]+tmp.w<dist[tmp.e]){ dist[tmp.e]=dist[tmp.b]+tmp.w; if(k==n)return false; } } } return true;}//如果要优化,可以加一个while语句判断,//当前是否有更新,如果没有更新,那么就跳出循环,成功。//当然,这种条件下必须要保证,没有负的权值回路,否则会出现while死循环。//同时为了寻找一个回路,我们可以加入一个记录父亲节点的数组,最后的时候,使用这个数组建立图,并且查找这个环即可。
Floyed算法
for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if ( e[i][j] > e[i][1]+e[1][j] ) e[i][j] = e[i][1]+e[1][j]; } }//自环初始化为0即可
0 0
- [模板]Dijkstra, Prime, Bellmanford, Floyed算法模板
- BellmanFord算法模板
- 单源最短路径Dijkstra、BellmanFord、SPFA【模板】
- POJ3660Cow Contest(floyed算法模板)
- 模板:Floyed
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
- 最短路(floyed算法,模板题)
- Dijkstra算法模板
- Dijkstra算法模板
- Dijkstra算法模板
- Dijkstra算法模板
- 朴素Dijkstra算法模板
- Dijkstra算法模板
- Dijkstra算法【模板】
- dijkstra算法模板
- Dijkstra算法 模板
- Dijkstra算法模板
- 假期集训总结
- python核心编程学习笔记-2016-08-27-01-多线程编程
- [{(三种括号匹配
- LeetCode: Largest Rectangle in Histogram
- bzoj 2669 状压dp 容斥原理
- [模板]Dijkstra, Prime, Bellmanford, Floyed算法模板
- [完]Linux 修改主机名
- FragmentPagerAdapter与FragmentStateAdapter的区别
- ssh默认端口修改
- fragment fragment 通信
- Intel汇编语言程序设计学习-第六章 条件处理-下
- React Native View Style
- 公路修建
- bzoj1419(期望与DP)