uva 125

floyd 算法   如果存在无数条路  则存在a->a的路  a->b的路径数等于 a->i 和 i->b(0=<i<=_max) 路径数的乘积和

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 30+5;
int n, g[maxn][maxn],ca;
int main()
{
    ca = 0;
    while (scanf("%d", &n) == 1)
    {
        int _max = 0;
        memset(g, 0, sizeof(g));
        for (int i = 0; i < n; i++)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            g[x][y] = 1;
            _max = max(_max, max(x, y));
        }
        for (int k = 0; k <= _max; k++)
            for (int i = 0; i <= _max; i++)
                for (int j = 0; j <= _max; j++)
                    g[i][j] += g[i][k]*g[k][j];
        for (int k = 0; k <= _max; k++)
            if (g[k][k])
                for (int i = 0; i <= _max; i++)
                    for (int j = 0; j <= _max; j++)
                        if (g[i][k] && g[k][j])
                            g[i][j] = -1;
        printf("matrix for city %d\n", ca++);
        for (int i = 0; i <= _max; i++)
        {
            for (int j = 0; j <= _max; j++)
            {
                if (j) putchar(' ');
                printf("%d", g[i][j]);
            }
            puts("");
        }
    }
    return 0;
}



posted @ 2013-10-06 15:11  xlc2845  阅读(115)  评论(0)    收藏  举报