• 写一下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]里面的; }
  • 相关阅读:
    jQuery选择器
    jQuery属性
    复选框的全选+全不选+ajax传递复选框的value值+后台接受复选框默认值
    [BZOJ1085][SCOI2005]骑士精神 搜索
    [BZOJ1004][HNOI2008]Cards 群论+置换群+DP
    [BZOJ1046][HAOI2007]上升序列 DP+贪心
    [BZOJ1016][JSOI2008]最小生成树计数 最小生成树 搜索
    [BZOJ1031][JSOI2007]字符加密Cipher 后缀数组
    后缀数组学习笔记
    [SPOJ8222]NSUBSTR
  • 原文地址:https://www.cnblogs.com/kczno1fans/p/7347860.html
Copyright © 2020-2023  润新知