大意:让你求一个城市到另一个城市的路径的条数。

 

思路:Floyd变形,关键是确定有无环。首先通过Floyd预处理,把所有的路径数求出来,d[i][j] += d[i][k]*d[k][j],然后确定有无环,如果存在环的话,即d[k][k] != 0(存在环),那么所有的点i,j,只要经过了k(i->k->j),那么它的路径数是不能确定的,反之,确定。

CODE:

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;

#define MAXN 1010

int d[MAXN][MAXN];
int n, m;

void init()
{
    n = -1;
    memset(d, 0sizeof(d));
}

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]);
    for(int k = 0; k <= n; k++) if(d[k][k])
    {
        d[k][k] = -1;
        for(int i = 0; i <= n; i++)
        {
            for(int j = 0; j <= n; j++)
            {
                if(d[i][k] && d[k][j])
                {
                    d[i][j] = -1;
                }
            }
        }
    }
}

void output()
{
    for(int i = 0; i <= n; i++)
    {
        for(int j = 0; j <= n; j++)
        {
            printf(j != n?"%d ":"%d\n", d[i][j]);
        }
    }
}

int main()
{
    int times = 0;
    while(~scanf("%d", &m))
    {
        init();
        while(m--)
        {
            int u, v;
            scanf("%d%d", &u, &v);
            d[u][v] = 1;
            n = max(n, max(u, v));
        }
        Floyd();
        printf("matrix for city %d\n", times++);
        output();
    }
    return 0;
}

 

posted on 2012-10-28 16:57  有间博客  阅读(175)  评论(0编辑  收藏  举报