准备睡觉,明天还得起早上学:(
/*
* HDU-1874 畅道工程续
* mike-w
* 2011-8-23
*----------------------
* practice dijkstra
*/
#include<stdio.h>
#define SIZE 222
#define INF (1<<30)
long road[SIZE][SIZE];
long dist[SIZE];
int in[SIZE];
int N,M;
int S,T;
int extract(void)
{
int i,t;
for(i=0;i<N;i++)
if(!in[i]&&dist[i]<INF)
break;
for(t=i++;i<N;i++)
if(!in[i]&&dist[i]<INF&&dist[i]<dist[t])
t=i;
return t>=N?-1:t;
}
long dijkstra(void)
{
int i;
long min;
dist[S]=0;
while((min=extract())!=T)
{
if(min==-1)
return -1;
in[min]=1;
for(i=0;i<N;i++)
if(!in[i]&&road[i][min]<INF&&dist[min]+road[min][i]<dist[i])
dist[i]=dist[min]+road[min][i];
}
return dist[T];
}
int main(void)
{
int i,j,t1,t2;
long t3;
/* freopen("1874.in","r",stdin); */
while(scanf("%d%d",&N,&M)!=EOF)
{
/* initialize */
for(i=0;i<N;i++)
for(j=0;j<N;j++)
road[i][j]=INF;
for(i=0;i<N;i++)
in[i]=0,dist[i]=INF;
/* read input */
for(i=0;i<M;i++)
{
scanf("%d%d%ld",&t1,&t2,&t3);
if(t3<road[t1][t2])
road[t1][t2]=road[t2][t1]=t3;
}
scanf("%d%d",&S,&T);
/* produce answer */
printf("%ld\n",dijkstra());
}
return 0;
}