UVA 125 - Numbering Paths(floyd)(二)
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
matrix for city 2
-1 -1 -1 -1 -1
0 0 0 0 1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
0 0 0 0 0
题意:给定一个图,求点点之间有多少种路径到达,如果有环输出-1.
思路:floyd变形,对于k点 如果f[k][k] != 0,则经过该点会形成环。
代码:
#include#include #define max(a,b) (a)>(b) (a):(b) const int N = 35; int m, f[N][N], cas = 0; int a, b, n; void init() { n = 0; memset(f, 0, sizeof(f)); for (int i = 0; i < m; i ++) { scanf("%d%d", &a, &b); f[a][b] = 1; n = max(max(a, b), n); } } void floyd() { for (int k = 0; k <=n; k ++) for (int i = 0; i <= n; i ++) for (int j = 0; j <= n; j ++) { f[i][j] += f[i][k] * f[k][j]; } for (int k = 0; k <=n; k ++) { if (f[k][k]) for (int i = 0; i <= n; i ++) for (int j = 0; j <= n; j ++) { if (f[i][k] && f[k][j]) f[i][j] = -1; } } } void solve() { init(); floyd(); printf("matrix for city %d\n", cas ++); for (int i = 0; i <= n; i ++) { for (int j = 0; j < n; j ++) printf("%d ", f[i][j]); printf("%d\n", f[i][n]); } } int main() { while (~scanf("%d", &m)) { solve(); } return 0; }