您的位置:首页 > 其它

学习小结——SPFA

2011-07-23 00:08 120 查看
今天看了下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");
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: