Dijkstra :
单源最短路,不允许有负权。
执行过程:
以某一源点开始(源点在集合内)找出与其连通的最近结点,并加入集合,然后松弛集合外的所有点,继续找与源点最近的集合外的点,加入集合,循环这个过程,直到所有点都进入集合为止。如果某点未在集合内,则该点与原点不连通。
模板:
#define NODE_SIZE 100
#define INFINITE_INT 0x0fffffff
int map[NODE_SIZE][NODE_SIZE];
bool Dijkstra(int res, int distance[], int node_size) {
int i , j;
int _site, _min;
bool visited[NODE_SIZE];
for( i = 0 ; i < node_size ; ++i ) {
distance[i] = map[res][i];
visited[i] = false;
}
distance[res] = 0;
visited[res] = true;
for( i = 1 ; i < node_size ; ++i ) {
_min = INFINITE_INT;
for( j = 0 ; j < node_size ; ++j ) {
if( distance[j] < _min && !visited[j] ) {
_site = j;
_min = distance[j];
}
}
if( _min == INFINITE_INT ){ return false; } // Not Connected
visited[_site] = true;
for( j = 0 ; j < node_size ; ++j ) {
if( distance[j] > distance[_site] + map[_site][j] )
{ distance[j] = distance[_site] + map[_site][j]; }
}
}
return true;
}