uva125
题目链接请戳 这里
解题思路
主要有两点:
1.当有中间节点可以经过时,根据乘法原理,i到j的路径数等于i到k路径数乘k到j的路径数。
2.只要路径中有经过某个节点是有回路的(即自己到自己),则路径数是无穷的。
代码
#include<stdio.h> #include<string.h> #include<algorithm> #define INF 1e9 #define N 40 using namespace std; bool d[N][N]; int mat[N][N]; int n, m; void floyd() { for (int k = 0; k <= n; k++) for (int i = 0; i <= n; i++) for (int j = 0; j <= n; j++) { d[i][j] = d[i][j] || (d[i][k] && d[k][j]); if (d[i][k] && d[k][j]) mat[i][j] += mat[i][k] * mat[k][j]; } } int main() { int citys = -1; while (scanf("%d", &m) != EOF) { memset(d, false, sizeof(d)); memset(mat, 0, sizeof(mat)); n = 0; citys++; for (int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); d[a][b] = true; mat[a][b] = 1; n = max(max(n, a), b); } floyd(); printf("matrix for city %d\n", citys); if (m == 0) continue; //只要中途路径中有一点有回路,则路径数是无穷的 for (int k = 0; k <= n; k++) if (d[k][k]) { for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { if (d[i][k] && d[k][j]) mat[i][j] = -1; } } } for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { printf(j == n ? "%d" : "%d ", mat[i][j]); } printf("\n"); } } return 0; }