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