您的位置:首页 > 其它

最短路spfa

2014-02-16 15:55 246 查看
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define mxn 10020
#define inf 0x3f3f3f3f
int first[mxn], nxt[mxn], to[mxn], cost[mxn], e;
void add( int u, int v, int c ) {
	to[e] = v;
	cost[e] = c;
	nxt[e] = first[u];
	first[u] = e++;
}
int dis[mxn], pre[mxn], in[mxn];
int q[mxn*10];
void spfa( int s ) {
	memset( dis, 0x3f, sizeof( dis ) );
	memset( in, 0, sizeof( in ) );
	int head = 0, tail = 0;
	q[tail++] = s;
	dis[s] = 0;
	in[s] = 1;
	pre[s] = -1;
	while( head < tail ) {
		int u = q[head++];
		in[u] = 0;
		for( int i = first[u]; i != -1; i = nxt[i] ) {
			int v = to[i];
			if( dis[v] > dis[u] + cost[i] ) {
				dis[v] = dis[u] + cost[i];
				pre[v] = s;
				if( ! in[v] ) in[v] = 1, q[tail++] = v;
			}
		}
	}
}
int main() {
	int n, m;
	while( scanf( "%d%d", &n, &m ) != EOF ) {
		memset( first, -1 ,sizeof( first ) );
		e = 0;
		for( int i = 1; i <= m; ++i ) {
			int u, v, c;
			scanf( "%d%d%d", &u, &v, &c );
			add( u, v, c );
			add( v, u, c );
		}
		int st, end;
		scanf( "%d%d", &st, &end );
		spfa( st );
		if( dis[end] == inf )
			printf( "-1\n" );
		else
			printf( "%d\n", dis[end] );
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: