学习小结——SPFA

今天看了下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");
	}
}

  

posted on 2011-07-23 00:08  Eucalyptus  阅读(189)  评论(0)    收藏  举报