邻接矩阵
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
const int Len= 105 ;
const int INF = 99999 ;
typedef struct Node{
int nv;
int ne;
int data[ Len] [ Len] ;
int visited[ Len] ;
} * graph;
graph CreateGraph ( int n)
{
int i , j;
graph g= ( graph) malloc ( sizeof ( struct Node) ) ;
g-> nv= n;
g-> ne= 0 ;
for ( i= 0 ; i< g-> nv; ++ i) {
g-> visited[ i] = 0 ;
for ( j= 0 ; j< g-> nv; ++ j) {
g-> data[ i] [ j] = INF;
}
}
return g;
}
void InsertEdge ( graph g, int s, int e, int pow)
{
g-> data[ s] [ e] = pow;
}
int djs ( graph g, int s, int e) {
int dst[ Len] ;
int st;
int minx;
for ( int i = 0 ; i< g-> nv; ++ i) {
dst[ i] = g-> data[ s] [ i] ;
}
for ( int i= 0 ; i< g-> nv; ++ i) {
minx = INF;
for ( int j= 0 ; j< g-> nv; ++ j) {
if ( g-> visited[ j] == 0 && dst[ j] < minx) {
st= j;
minx= dst[ j] ;
}
}
g-> visited[ st] = 1 ;
for ( int j = 0 ; j< g-> nv; ++ j) {
if ( g-> visited[ j] == 0 && dst[ j] > dst[ st] + g-> data[ st] [ j] ) {
dst[ j] = dst[ st] + g-> data[ st] [ j] ;
}
}
}
return dst[ e] ;
}
int main ( ) {
int n, i, q, b, c, d, m, s, sum= 1 ;
scanf ( "%d %d" , & s, & q) ;
graph g= CreateGraph ( s) ;
for ( i= 0 ; i< q; ++ i) {
scanf ( "%d %d %d" , & b, & c, & d) ;
InsertEdge ( g, b, c, d) ;
}
while ( ~ scanf ( "%d" , & n) , n!= - 1 ) {
for ( i= 0 ; i< g-> nv; ++ i) {
g-> visited[ i] = 0 ;
}
scanf ( "%d" , & m) ;
printf ( "%d\n" , djs ( g, n, m) ) ;
}
system ( "pause" ) ;
return 0 ;
}
邻接表
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
const int Len= 105 ;
const int INF = 99999 ;
typedef struct AdjVNode * PtrToAdjVNode;
struct AdjVNode {
int adjv;
int pow;
PtrToAdjVNode Next;
} ;
typedef struct Vnode{
PtrToAdjVNode FirstEdge;
} AdjList[ Len] ;
typedef struct Node{
int nv;
int ne;
int visited[ Len] ;
AdjList G[ Len] ;
} * graph;
graph CreateGraph ( int n)
{
int i;
graph g = ( graph) malloc ( sizeof ( struct Node) ) ;
g-> nv= n;
g-> ne= 0 ;
for ( i= 0 ; i< g-> nv; ++ i) {
g-> G[ i] -> FirstEdge= NULL ;
}
for ( i= 0 ; i< g-> nv; ++ i) {
g-> visited[ i] = 0 ;
}
return g;
}
void InsertEdge ( graph g, int s, int e, int pow)
{
PtrToAdjVNode newb;
newb= ( PtrToAdjVNode) malloc ( sizeof ( struct AdjVNode) ) ;
newb-> adjv= e;
newb-> pow= pow;
newb-> Next= g-> G[ s] -> FirstEdge;
g-> G[ s] -> FirstEdge= newb;
}
int djs ( graph g, int s, int e) {
int dst[ Len] ;
int st;
int minx;
int i= 0 ;
for ( int i= 0 ; i< g-> nv; ++ i) {
dst[ i] = INF;
}
while ( g-> G[ s] -> FirstEdge!= NULL ) {
dst[ g-> G[ s] -> FirstEdge-> adjv] = g-> G[ s] -> FirstEdge-> pow;
g-> G[ s] -> FirstEdge= g-> G[ s] -> FirstEdge-> Next;
}
for ( int i= 0 ; i< g-> nv; ++ i) {
minx = INF;
for ( int j= 0 ; j< g-> nv; ++ j) {
if ( g-> visited[ j] == 0 && dst[ j] < minx) {
st= j;
minx= dst[ j] ;
}
}
g-> visited[ st] = 1 ;
while ( g-> G[ st] -> FirstEdge!= NULL ) {
if ( g-> visited[ g-> G[ st] -> FirstEdge-> adjv] == 0 && dst[ g-> G[ st] -> FirstEdge-> adjv] > dst[ st] + g-> G[ st] -> FirstEdge-> pow) {
dst[ g-> G[ st] -> FirstEdge-> adjv] = dst[ st] + g-> G[ st] -> FirstEdge-> pow;
}
g-> G[ st] -> FirstEdge= g-> G[ st] -> FirstEdge-> Next;
}
}
return dst[ e] ;
}
int main ( ) {
int n, i, q, b, c, d, m, s, sum= 1 ;
scanf ( "%d %d" , & s, & q) ;
graph g= CreateGraph ( s) ;
graph gcopy= CreateGraph ( s) ;
for ( i= 0 ; i< q; ++ i) {
scanf ( "%d %d %d" , & b, & c, & d) ;
InsertEdge ( g, b, c, d) ;
InsertEdge ( gcopy, b, c, d) ;
}
while ( ~ scanf ( "%d" , & n) , n!= - 1 ) {
for ( i= 0 ; i< g-> nv; ++ i) {
g-> visited[ i] = 0 ;
}
scanf ( "%d" , & m) ;
printf ( "%d\n" , djs ( g, n, m) ) ;
for ( i= 0 ; i< g-> nv; ++ i) {
g-> G[ i] -> FirstEdge= gcopy-> G[ i] -> FirstEdge;
}
}
system ( "pause" ) ;
return 0 ;
}