poj 2570经典二进制floyd

本文探讨了如何利用Floyd算法与位运算解决路由问题,具体阐述了如何通过位运算优化路由选择过程,确保数据仅通过一家公司光纤传输。详细介绍了算法计算方式及其实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//  floyd  +  位运算


/*  题目大意:有若干家公司,他们分别在若干个城市的路由器间铺设了自己的光纤,
现在问,如果要从路由器A到路由器B传送资料,能否只使用一家公司的光纤而达到目的,
如能则分别输出这些公司的代号。

思路:虽然不是最短路,却可以用每对顶点的最短路径 floyd-warshell 算法来求解。
dist[i][j]代表 i 到 j 的一条可能包含前k个点中若干个顶点的所有路径中最短的路径。
而在本题中
graph[i][j]代表i 到 j 的包含前k个点中若干个顶点的所有路径中的可行解的状态(压缩到整形里位表示)

计算方式为:
graph[i][j] = graph[i][j] | (graph[i][p] & graph[p][j])
最后也就根据要求查询位状态即可。

*/

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

const int maxn = 201;

int n;
int graph[maxn][maxn];

void init()
{
    int i;
    int v1,v2,length;
    char company[27];
    memset(graph,0,sizeof(graph));
    while (scanf("%d %d ",&v1,&v2)&&(v1!=0&&v2!=0))
    {
        scanf("%s",&company);
        length = strlen(company);
        for (i=0;i<length;++i)
            graph[v1][v2] |= (1<<(company[i]-'a')); //用二进制位来表示城市
    }
}

void floyd()
{
    int pre,past;
    int p,i,j;
    for (p=1;p<=n;++p)
    {    for (i=1;i<=n;++i)
            for (j=1;j<=n;++j)
                graph[i][j] = graph[i][j] |	(graph[i][p]&graph[p][j]);
    }
}

void output()
{
    bool any;
    int i;
    int v1, v2, pre = n & 1;
    while (scanf("%d %d",&v1,&v2)&&(v1!=0&&v2!=0))
    {
        any = false;
        for (i=0;i<26;++i)
            if (graph[v1][v2]&(1<<i))
            {
                printf("%c",'a'+i);
                any = true;
            }
        if (!any)printf("-");
        putchar('\n');
    }
    putchar('\n');
}

int main()
{
    while (scanf("%d",&n)&&n)
    {
        init();
        floyd();
        output();
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值