zoukankan      html  css  js  c++  java
  • 写一下SPFA和迪杰斯特拉的模版。。。第一次写博客,有错请提出哦!

    
    
    SPFA的模版
    #include<bits/stdc++.h>
    using namespace std;
    queue <int> q;
    typedef pair <int , int> PII;
    vector <PII> s[1000000];
    int m,n,x,y,val,dian[1000000],zou[1000000],rankk,zhong;
    main(){
        scanf("%d%d",&n,&m);//n个点,m条边; 
        for(int i=1;i<=m;i++)//存边,是无向图; 
        {
            scanf("%d%d%d",&x,&y,&val);
            s[x].push_back(PII(y,val));
            s[y].push_back(PII(x,val));
        }
        memset(dian,42,sizeof(dian));
        dian[1]=0;
        q.push(1);
        zou[1]=1;
        while(!q.empty())
        {
            rankk=q.front();
            q.pop();
            zou[rankk]=0;
            for(int i=0;i<s[rankk].size();i++)//枚举每一条边,判断是否可以更新; 
            {
                zhong=s[rankk][i].first;
                val=s[rankk][i].second;
                if(dian[zhong]>dian[rankk]+val)
                {
                    dian[zhong]=dian[rankk]+val;
                    if(zou[zhong]==1)
                        continue;
                    q.push(zhong);
                    zou[zhong]=1;
                }
            }
        }
        //这样,从1到X的最短距离就存在dian[x]里面的; 
    }
    //迪杰斯特拉的模版

    #include<bits/stdc++.h> using namespace std; struct edge{ //只是一个结构体而已 ; int rank,val; }; priority_queue <edge> q; //优先队列,存着结构体; bool operator <(edge a,edge b) //为优先队列排序 { return a.val > b.val ; } typedef pair <int , int> PII; //第一个INT存着指向的编号,第二个INT存着距离; vector <PII> s[100000]; int n,m,x,y,val,zhong,rankk,dian[1000000],zou[1000000];//zou代表有没有走过,点代表从1到x点的距离dian[x]; main(){ scanf("%d%d",&n,&m);//n个点,m条边; for(int i=1;i<=m;i++)//存边,是无向图; { scanf("%d%d%d",&x,&y,&val); s[x].push_back(PII(y,val)); s[y].push_back(PII(x,val)); } memset(dian,42,sizeof(dian));//初始化点为无限大,最好不要用127,小心加起来时爆掉; edge E; E.rank = 1; q.push(E); //存入开始点的信息; zou[1] = 1; dian[1] = 0; while(!q.empty()) { rankk=q.top().rank;//队首的点的编号; q.pop(); if(zou[rankk]==1)//判断是否走过 ; continue; zou[rankk] = 1; for(int i=0;i<s[rankk].size();i++)//枚举每一条边,判断是否可以更新; { zhong=s[rankk][i].first; val=s[rankk][i].second; if(dian[zhong]>dian[rankk]+val) { dian[zhong]=dian[rankk]+val; edge E; E.rank = zhong; E.val = dian[zhong]; q.push(E);//可以更新就重新存入队列; } } } //这样,从1到X的最短距离就存在dian[x]里面的; }
  • 相关阅读:
    博客园的自定义皮肤
    为自己的审美观感到惭愧
    关于GitHub的Hello Word
    使用Windows Live Writer撰写的第一篇博文
    正式入驻博客园了
    一个使用 Web Components 的音乐播放器: MelodyPlayer
    一个(伪)MaterialDesign风格的博客园皮肤
    从零开始,做一个NodeJS博客(一):Heroku上的最简NodeJS服务器
    从零开始,做一个NodeJS博客(零):整体规(chui)划(niu)
    在 Xamarin.Android 中使用 Notification.Builder 构建通知
  • 原文地址:https://www.cnblogs.com/kczno1fans/p/7347860.html
Copyright © 2011-2022 走看看