[模板]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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公路车尾钩歪了怎么办 铃木羚羊车大灯不亮怎么办 玻璃瓶打碎了里面食物怎么办 玻璃门上轴坏了怎么办 配筋面积小了怎么办 ps大文件存不了怎么办 挑架钢丝绳拉环未预埋怎么办 出现偏拉的梁怎么办 尾插不好上锡怎么办 汽车玻璃上的焊点很难去除怎么办 拆苹果硬盘焊点掉了怎么办 玻璃被电焊滴到怎么办 gta5特质卡宾装了消音器怎么办 联想V形底座不好用怎么办 华为手环不计步怎么办 小米手环不计步怎么办 小米手环骑自行车不计步数怎么办 放逐之城着火了怎么办 城市天际线地价过低怎么办 放逐之城铁采完怎么办 车钥匙反锁车内怎么办 眼镜用热水洗了怎么办 眼镜放平后眼镜腿不平怎么办 瞄准镜十字歪了怎么办 瞄准镜调到底了怎么办 墨镜镜片刮花了怎么办 usb小风扇不转怎么办 金属眼镜压歪了怎么办 眼镜被电焊打了怎么办 电焊闪的眼睛疼怎么办 烧了电焊眼睛疼怎么办 用了电焊眼睛痛怎么办 烧电焊脸上红痛怎么办 眼睛让电焊晃了怎么办 眼被电焊打了怎么办 眼镜弹簧腿坏了怎么办 眼镜框铰链坏了怎么办 金属眼镜框歪了怎么办 眼镜框螺丝断了怎么办 眼镜被压变形了怎么办 金属眼镜腿断了怎么办