今天看了下SPFA算法,写了个模板。。。
真是神物啊。。。理论上O(m)的复杂度下界。。。竟然能达到O(km)的程度。。。
#include <stdio.h>
#include <string.h>
#define MAXN 100
#define inf 100000000
int head[MAXN],pnt[MAXN*MAXN],next[MAXN*MAXN],length[MAXN*MAXN];
int dist[MAXN],prev[MAXN];
int inqueue[MAXN];
int queue[2*MAXN];
int n;
int a,b,len;
int tot;
void addedge(int a,int b,int len)
{
pnt[tot]=b;
length[tot]=len;
next[tot]=head[a];
head[a]=tot++;
}
void spfa(int src)
{
for(int i=0; i<n; i++) {
dist[i]=inf;
prev[i]=-1;
}
int qhead,qtail;
qhead=0;
qtail=0;
queue[qtail++]=src;
inqueue[src]=1;
dist[src]=0;
while(qhead<qtail) {
int idx=head[queue[qhead]];
while(~idx) {
if(dist[queue[qhead]]+length[idx] < dist[pnt[idx]]) {
dist[pnt[idx]]=dist[queue[qhead]]+length[idx];
prev[pnt[idx]]=queue[qhead];
queue[qtail++]=pnt[idx];
inqueue[pnt[idx]]=1;
}
idx=next[idx];
}
inqueue[queue[qhead]]=0;
qhead++;
}
}
int main()
{
tot=0;
memset(inqueue,0,sizeof(inqueue));
memset(head,-1,sizeof(head));
memset(next,-1,sizeof(next));
scanf("%d",&n);
while (scanf("%d%d%d",&a,&b,&len),~a)
addedge(a,b,len);
spfa(0);
for(int i=0; i<n; i++) {
printf("%d:",dist[i]);
int idx=i;
while (~idx) {
printf("%d ",idx);
idx=prev[idx];
}
printf("\n");
}
}
浙公网安备 33010602011771号