UVA 125 - Numbering Paths(floyd)(二)

2014-11-24 02:44:47 · 作者: · 浏览: 3
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;  
}