spfa普通版就不写了,优化还是要的昂,spfa是可以判负环,接受负权边和重边的,判断负环只需要另开一个数组记录每个结点的入队次数,当有任意一个结点入队大于点数就表明有负环存在
1 #include<stdio.h> //spfa基本上要这些头文件 2 #include<string.h> 3 #include<queue> 4 using namespace std; 5 6 void spfa(int s,int p){ 7 memset(vis,0,sizeof(vis)); 8 memset(dist,-1,sizeof(dist)); 9 queue<int>q; 10 vis[s]=1; 11 dist[s]=0; 12 q.push(s); 13 while(!q.empty()){ 14 int i,t=q.front(); 15 vis[t]=0; 16 q.pop(); 17 for(i=head[t];~i;i=next[i]){ 18 int j=point[i]; 19 if(dist[j]==-1||dist[j]>dist[t]+val[i]){ 20 dist[j]=dist[t]+val[i]; 21 if(!vis[j]){ 22 q.push(j); 23 vis[j]=1; 24 } 25 } 26 } 27 } 28 printf("%d\n",dist[p]); 29 }
时间: 2024-11-08 19:25:08