最短路——SPFA

Bellman-Ford基础上的队列优化,效率比较高,可以检测负环。

const int maxn = 110;
const int max_int = ~(1<<31);
const int min_int = (1<<31);

bool inq[maxn];
int cost[maxn][maxn], dist[maxn], cnt[maxn], q[maxn], front, rear;
//[0,max_int]

int min(int a, int b){
	return a < b ? a : b;
}

int spfa(int s){
	memset(inq, 0, sizeof(inq));
	memset(cnt, 0, sizeof(cnt));
	for(int i = 0; i < n; ++i){
		dist[i] = max_int;
	}
	dist[s] = 0;
	front = rear = 0;
	q[rear++] = s;
	inq[s] = true;
	++cnt[s];
	while(front != rear){
		int now = q[front++];
		inq[now] = false;
		for(int i = 0; i < n; ++i)if(cost[now][i] != max_int && dist[i] > dist[now] + cost[now][i]){
			dist[i] = dist[i] + cost[now][i];
			if(!inq(i)){
				q[rear++] = i;
				inq[i] = true;
				++cnt[i];
			}
			if(cnt[i] > n){
				return -1;
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值