很抽象的最短路,想了很久也没有想出来,最后看了别人的博客还是似懂非懂,这里推荐一篇:
http://blog.csdn.net/u013761036/article/details/39377499
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 500;
const int INF = 0x3f3f3f3f;
bool vis[maxn];
int N, G[maxn][maxn], dis[maxn];
void spfa(int s) {
for (int i = 1; i <= N; i++) dis[i] = INF, vis[i] = false;
queue<int> q;
for (int i = 1; i <= N; i++) {
if (s == i) continue;
dis[i] = G[s][i];
vis[i] = true;
q.push(i);
}
while (!q.empty()) {
int u = q.front(); q.pop();
vis[u] = false;
for (int i = 1; i <= N; i++) {
if (dis[i] > dis[u] + G[u][i]) {
dis[i] = dis[u] + G[u][i];
if (!vis[i]) {
vis[i] = true;
q.push(i);
}
}
}
}
}
int main () {
while (~scanf("%d", &N)) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
scanf("%d", &G[i][j]);
}
}
spfa(1);
int ans1 = dis[N];
int ans2 = dis[1];
spfa(N);
int ans3 = dis[N];
printf("%d\n", min(ans1, ans2 + ans3));
}
return 0;
}