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]里面的; }