最短路径算法
//面向邻接链表的DJ

#include 
<stdio.h>

const int MAX = 0x7fffffff;

struct
{
    
int next;
    
int last;
}
head[1001];

typedef struct
{
    
int next;
    
int valu;
    
int dis;
}
type;
type p[
40001];
int now;

void initm ( int n )
{

    
for ( int i=0; i<n; i++ )
    
{
        head[i].next 
= head[i].last = -1;
    }

}


void add ( int b, int e, int d )
{

    p[now].next 
= -1;
    p[now].valu 
= e;
    p[now].dis 
= d;
    
if ( head[b].next == -1 )
    
{
        head[b].next 
= now;
    }

    
else
    
{
        p[ head[b].last ].next 
= now;
    }

    head[b].last 
= now ++;
}


int used[1001];

int dis[1001];

void initdj ( int s, int n, int *di )
{

    
for ( int i=0; i<n; i++ )
    
{
        used[i] 
= 0;
        di[i] 
= MAX;
    }

    di[s] 
= 0;
}


int  dj ( int s, int t, int n, int *di )
{

    initdj ( s, n, di );
    
    
int i, j;
    
int now;

    
for ( i=0; i<n; i++ )
    
{
        type min;
        min.dis 
= MAX;
        
for ( j=0; j<n; j++ )
        
{
            
if ( min.dis > di[j] && ! used[j] )
            
{
                min.dis 
= di[j];
                min.valu 
= j;
            }

        }

        
if ( min.valu == t )
        
{
            
break;
        }

        now 
= min.valu;
        used[ min.valu ] 
= 1;
        
for ( j=head[now].next; j!=-1; j=p[j].next )
        
{
            
if ( ! used[ p[j].valu ] && di[ p[j].valu ] > di[now] + p[j].dis  )
            
{
                di[ p[j].valu ] 
= di[now] + p[j].dis;
            }

        }

    }


    
return di[t];
    
}


int main ()
{

    
int t, n;
    
int b, e, r;

    
while ( scanf ( "%d%d"&t, &n ) != EOF )
    
{
        initm ( n );
        
for ( int i=0; i<t; i++ )
        
{
            scanf ( 
"%d%d%d"&b, &e, &r );
            add ( b
-1, e-1, r );
            add ( e
-1, b-1, r );
        }


        printf ( 
"%d\n", dj ( n-10, n, dis ) );

    }

    
return 0;
}