看了http://www.cnblogs.com/kuangbin 的博客才有思路的、
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <map>
#define LL long long
#define DB double
using namespace std;
const int N = 309;
const int INF = 0x3f3f3f3f;
int re[N][N];
int n;
int dis[N];
queue<int> que;
int inque[N];
int spfa(int st,int en)
{
int ini = 1;
memset(dis,INF,sizeof(dis));
dis[st] = 0;
while(!que.empty()) que.pop();
que.push(st);
while(!que.empty())
{
int e = que.front();que.pop();
inque[e] = 0;
for(int i=1;i<=n;i++)
if(dis[i]>dis[e]+re[e][i])
{
dis[i] = dis[e] + re[e][i];
if(!inque[i]) que.push(i),inque[i] = 1;
}
if(ini) dis[st] = INF,ini = 0;
}
return dis[en];
}
void solve()
{
printf("%d\n",min(spfa(1,n),spfa(1,1)+spfa(n,n)));
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&re[i][j]);
solve();
}
return 0;
}