http://poj.org/problem?id=2502
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <set>
using namespace std;
#define MAXN 2050
#define MAXM 100000+10
#define INF 999999999
struct Node{
int to,next;
double val;
}node[MAXM];
int px[MAXN],py[MAXN];
int head[MAXN],tot,n,m;
bool vis[MAXN];
double dis[MAXN];
double dist(int i,int j) {
int x = px[i]-px[j];
int y = py[i]-py[j];
return sqrt(x*x+y*y*1.0);
}
void add(int x,int y,int d){
double temp=dist(x,y)/(d*1000.0/60);
node[tot].to=y;
node[tot].next=head[x];
node[tot].val=temp;
head[x]=tot++;
node[tot].to=x;
node[tot].next=head[y];
node[tot].val=temp;
head[y]=tot++;
}
void spfa(){
int x,t,i;
queue<int >q;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++) dis[i]=INF;
dis[0]=0;q.push(0);vis[0]=1;
while(!q.empty()){
x=q.front();q.pop();vis[x]=0;
for(i=head[x];i!=-1;i=node[i].next)
if(dis[node[i].to]>dis[x]+node[i].val){
dis[node[i].to]=dis[x]+node[i].val;
if(!vis[node[i].to]){vis[node[i].to]=1;q.push(node[i].to);}
}//if
}//while
}
int main(){
tot=0;
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
scanf("%d%d%d%d",&px[0],&py[0],&px[1],&py[1]);
int pos,i,j;
pos=i=2;
while(scanf("%d%d",&px[i],&py[i])!=EOF){
if(px[i]==-1&&py[i]==-1){
for(j=pos;j<i-1;j++) add(j,j+1,40);
pos=i;
}else i++;
}//while
n=i;
for(i=0;i<n;i++)for(j=i+1;j<n;j++) add(i,j,10);
spfa();
printf("%.0lf\n",dis[1]);
return 0;
}