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 }