Hdu 1625 Numbering Paths

 

大意:让你求城市与城市之间可到达路径的条数。

思路:Floyd变形,需要对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]);
        }
    }
     return ;
}

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;
}

 

转载于:https://www.cnblogs.com/g0feng/archive/2012/10/28/2743739.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值