题目大意就是n个点,m条路,求第一个点到最后一个点(1->n)的最短路径长度.
题目的数据很小(<=100),给俺们这种新手练手很合适.所以用Floyd和Djistera都做了一下.贴代码:
/*
* 不允许负权边
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
const int MAX = 128;
const int INF = INT_MAX>>1;
int cost[MAX][MAX];
bool used[MAX];
int d[MAX];
int V, E;
/* s是起点编号 */
int djistera(int s, int t) {
d[s] = 0;
while (true) {
int v = -1;
for (int u = 0; u < V; ++u) {
if (!used[u] && (v == -1 || d[u] < d[v])) v = u; //找到下一个用来更新其他点的点
}
if (v == -1) break;
used[v] = true;
for (int u = 0; u < V; ++u) {
d[u] = min(d[u], d[v] + cost[v][u]);
}
}
return d[t];
}
int main() {
while (scanf(" %d %d", &V, &E) != EOF) {
fill(d, d + V, INF);
for (int i = 0; i < V; ++i) fill(cost[i], cost[i]+V, INF);
memset(used, false, sizeof(used)); //fill(used, used+V, false)
if (!V) break;
int from, to, dis;
for (int i = 0; i < E; ++i) {
scanf(" %d %d %d", &from, &to, &dis);
--from, --to;
cost[from][to] = cost[to][from] = dis;
}
printf("%d\n", djistera(0, V - 1));
}
return 0;
}
酱紫O O
然后还有代码量更小的Floyd算法
#include <cstdio>
#include <cstring>
#include <algorithm>
const int MAX = 128;
const int INF = 1e8;
int main() {
int dp[MAX][MAX];
int n, m;
while (scanf(" %d %d", &n, &m) != EOF && n) {
int i, j, s, t, c;
for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) dp[i][j] = i^j ? INF : 0;
for (i = 0; i < m; ++i) {
scanf(" %d %d %d", &s, &t, &c);
--s, --t;
dp[s][t] = dp[t][s] = c;
}
for (int k = 0; k < n; ++k)
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j) {
dp[i][j] = std::min(dp[i][j], dp[i][k]+dp[k][j]);
}
printf("%d\n", dp[0][n-1]);
}
}
好了好了