https://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm
算法过程简述:
变量定义:点集point,邻接表类型pointtype,dis是点的最小估计距离,next是点的邻接信息,vis是点的队内标记。q为队列。
初始化:读入图信息,创建邻接表,起点最小估计距离设定
1 struct edgetype
2 {
3 int to;
4 int len;
5 };
6 struct pointtype
7 {
8 int dis;
9 vector<edgetype> next;
10 bool vis;
11 }point[10001];
12 queue<int> q;
13 int n,m,s,t;
14 void init()
15 {
16 scanf("%d%d%d%d",&n,&m,&s,&t);
17 for(int i=1;i<=n;i++)
18 {
19 point[i].dis=1000000000;
20 point[i].vis=false;
21 point[i].next.clear();
22 }
23 for(int i=1;i<=m;i++)
24 {
25 edgetype tmp;
26 int x,y,z;
27 scanf("%d%d%d",&x,&y,&z);
28 tmp.to=y;
29 tmp.len=z;
30 point[x].next.push_back(tmp);
31 tmp.to=x;
32 point[y].next.push_back(tmp);
33 }
34 point[s].dis=0;
35 point[s].vis=true;
36 q.push(s);
37 return;
38 }
39 void SPFA()
40 {
41 while(!q.empty())
42 {
43 int now=q.front();
44 q.pop();
45 vector<edgetype>::iterator it;
46 for(it=point[now].next.begin();it!=point[now].next.end();it++)
47 {
48 if(point[(*it).to].dis>point[now].dis+(*it).len)
49 {
50 point[(*it).to].dis=point[now].dis+(*it).len;
51 if(!point[(*it).to].vis)
52 {
53 q.push((*it).to);
54 point[(*it).to].vis=true;
55 }
56 }
57 }
58 }
59 return;
60 }