#include <cstdio> #include <cstdlib> #include <stack> #include <algorithm> using namespace std; const int MAXN = 50; const int INF = 1000000000; int mat[MAXN][MAXN], min_distance[MAXN], v[MAXN]; int n, s; void dijkstra() { int i, j, k; for (i = 0; i < n; i++) { min_distance[i] = INF; v[i] = 0; } for (min_distance[s] = 0, j = 0; j < n; j++) { for (k = -1, i = 0; i < n; i++) { if (!v[i] && (k == -1 || min_distance[i] < min_distance[k])) { k = i; } } for (v[k] = 1, i = 0; i < n; i++) { if (!v[i] && min_distance[k] + mat[k][i] < min_distance[i]) { min_distance[i] = min_distance[k] + mat[k][i]; } } } } int main() { scanf("%d%d", &n, &s); for (int i = 0;i < n;i++) { for (int j = 0;j < n;j++) { scanf("%d", &mat[i][j]); if (mat[i][j] == 0) mat[i][j] = INF; } } dijkstra(); for (int i = 0;i < n;i++) { if (i != s) { if (min_distance[i] < INF) printf("%d ", min_distance[i]); else printf("%d ", -1); } } puts(""); return 0; } /************************************************************** Problem: 2165 User: admin Language: C++ Result: Accepted Time:9 ms Memory:1156 kb ****************************************************************/