[板子]三种最短路
1 #include<bits/stdc++.h> 2 using namespace std; 3 void SPFA(int x){ 4 memset(dis,0x3f,sizeof dis); 5 memset(vis,0,sizoef vis); 6 queue<int> q; 7 8 vis[x]=1;dis[x]=0; 9 q.push(x); 10 while(!q.empty()){ 11 int now=q.front(); 12 for(int i=head[now];i;i=nxt[i])if(dis[to[i]]>dis[now]+c[i]){ 13 dis[to[i]]=dis[now]+c[i]; 14 if(!vis[dis[to[i]]]) q.push(to[i]); 15 } 16 vis[now]=0;q.pop(); 17 } 18 } 19 /* 20 不同点也许是Dij用的是优先队列,而spfa用的是队列? 21 Dij保证每次取出都是没更新过中的最小值,而spfa通过不断的松弛达到最优解。 22 还是用Dij比较稳,复杂度有保证,但spfa可以处理负环而Dij不能。 23 */ 24 void Dijkstra(int x){ 25 memset(dis,0x3f,sizeof dis); 26 memset(vis,0,sizeof vis); 27 priority_queue<pair<int,int> >q; 28 29 dis[x]=0;q.push_back(make_pair(0,x)); 30 while(!q.empty()){ 31 int y=q.top().second;q.pop(); 32 if(vis[y])continue;vis[y]=1; 33 for(int i=head[y];i;i=nxt[i])if(dis[to[i]]>dis[y]+c[i]){ 34 dis[to[i]]=dis[y]+c[i]; 35 q.push(make_pair(-dis[to[i]],to[i])); 36 } 37 } 38 } 39 40 void Floyed(){ 41 for(int k=1;k<=n;++k) 42 for(int i=1;i<=n;++i) 43 for(int j=1;j<=n;++j) 44 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); 45 }
Keep it simple and stupid.