#include <iostream>
using namespace std;
int main()
{
int arcs[19][19]={
0,2,1,1,1,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
100,0,100,100,100,100,1,100,100,2,100,100,100,100,100,100,100,100,100,
100,100,0,3,100,3,3,100,100,100,100,100,100,100,100,100,100,100,100,
100,100,100,0,100,100,2,1,2,100,100,100,100,100,100,100,100,100,100,
100,100,100,100,0,100,100,1,3,100,100,100,100,100,100,100,100,100,100,
100,100,100,100,100,0,1,100,100,1,100,100,100,100,100,100,100,100,100,
100,100,100,100,100,100,0,100,3,100,2,100,100,100,100,100,100,100,100,
100,100,100,100,100,100,100,0,1,100,100,2,100,100,100,100,100,100,100,
100,100,100,100,100,100,100,100,0,100,100,100,3,100,100,100,100,100,100,
100,100,100,100,100,100,100,100,100,0,100,100,100,100,100,100,100,100,2,
100,100,100,100,100,100,100,100,100,100,0,3,100,1,100,100,100,100,100,
100,100,100,100,100,100,100,100,100,100,100,0,1,100,100,100,100,1,100,
100,100,100,100,100,100,100,100,100,100,100,100,0,2,100,100,1,100,1,
100,100,100,100,100,100,100,100,100,100,100,100,100,0,100,1,100,100,100,
100,100,100,100,100,100,100,100,100,100,100,100,100,100,0,100,100,3,100,
100,100,100,100,100,100,100,100,100,100,100,100,100,100,1,0,100,100,100,
100,100,100,100,100,100,100,100,100,100,100,100,100,100,1,100,0,100,100,
100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,0,1,
100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,0,
};
int i,num,min,j;
int dist[19],path[19],s[19];
for(i=0;i<19;i++)//初始化数组s,dist,path
{
s[i]=0;
dist[i]=arcs[0][i];
if(dist[i]==100)path[i]=-1;
else path[i]=0;
}
s[0]=1;//1代表在集合中,0代表不在集合中
min=1;
num=1;
while(num<19)
{
j=100;
for(i=1;i<19;i++){//dist中查找s=0的最小值元素
if(s[i]==0&&dist[i]<j)
{
j=dist[i];
min=i;
}
}
s[min]=1;//将新生成的起点加入s
for(i=0;i<19;i++) //修改dist和path
{
if(s[i]==0&&dist[i]>dist[min]+arcs[min][i])
{
dist[i]=dist[min]+arcs[min][i];//用已经找到的最短路径修改对应的dist
path[i]=min;//用已经找到的最短路径修改对应的path
}
}
num++;
}
cout<<dist[18]<<endl;
return 0;
}