poj 2570 Fiber Network --floyd求传递闭包加位运算

原创 2016年08月29日 19:02:23

题目链接:
http://poj.org/problem?id=2570
题目意思很简单,给你一个网路图,对于图上的站点,如果是可以连通的会标出可以修通从i站点到j站点的公司,公司用小写字母表示。会给出很多个询问,对于每个询问(A,B),求出能修通从A到B的公司。
分析
g[i][j][m]表示对于公司m能修通从从i站点到j站点的网络,这样相当于建了26个图,然后对每个图做一次Floyd,也就26次。况且V最多两百,应该也是能过的,然而我却死活过不了。。。TLE。。后来看了一下题解,用单独的‘位’来表示公司是否能连通i,j.即对于输入的每条边先做预处理g[i][j]|=(1<<(s[i]a)),因为Floyd算法只会对单独的‘位’做操作,这样的话就只需做一次Floyd了。这样做确实会快一些。。。但是,,,但是,,这不是最关键的优化,在我优化了仍旧TLE两次之后我终于发现秘密了原来是该死的printf,把printf改成putchar之后就A了。。。

更加惊讶的是对没有优化的算法,把所有的printf改成putchar之后也能A掉。。。

附上代码

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
#define MAX_V 209

using namespace std;

const int num = 26;

int  g[MAX_V][MAX_V];
int nv;


int main()
{
    //freopen("H:\\c++\\file\\stdin.txt","r",stdin);

   char s[27];
   int A,B;



   while(~scanf("%d",&nv)&&nv)
   {
       memset(g,0,sizeof(g));

       for(int i=1 ; i<=nv ; ++i)
            g[i][i] = 1;

       while(~scanf("%d %d",&A,&B) &&A)
       {
           scanf("%s",s);
           int len = strlen(s);
           for(int i=0 ; i<len ; ++i)
           {
               g[A][B] |= (1<<(s[i]-'a'));
           }
       }

       //floyd
            for(int k=1 ; k<=nv ; k++)
                for(int i=1 ; i<=nv ; i++)
                    for(int j=1 ; j<=nv ; ++j)
                        g[i][j] |= (g[i][k]&g[k][j]);


       while(~scanf("%d %d",&A,&B) &&A)
       {
           if(!g[A][B])printf("-");
           else
                for(int i=0 ; i<num ;++i )
                    if(g[A][B] & (1<<i))
                        putchar(i+'a');
           printf("\n");
       }
       printf("\n");
   }


    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 2570 Fiber Network(传递闭包,floyd+位运算)

Fiber Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2703   Accepted: 12...
  • WEYuLi
  • WEYuLi
  • 2013年06月29日 17:29
  • 469

POJ 2570 Fiber Network(Floyd传递闭包+状态压缩)

POJ 2570 Fiber Network(Floyd传递闭包+状态压缩) http://poj.org/problem?id=2570 题意:有一个有向图,对于有向图的每条边上有一个公司名字的集合...

POJ--2570--Fiber Network【floyd+位运算】

题意:一些公司决定搭建一些光纤网络,单向的,如果从第一点到第二点,有ab两个公司可以搭建,第二点到第三点有ac两个公司可以搭建,第一点到第三点有d公司可以搭建,则第一点到第三点有a、d两个公司可以搭建...
  • zzzz40
  • zzzz40
  • 2014年08月01日 11:30
  • 604

Poj 2570 Fiber Network【Floyd+状态压缩】

Fiber Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3511   Ac...

poj 2570 Fiber Network floyd算法

题意:
  • sepNINE
  • sepNINE
  • 2014年11月15日 15:26
  • 369

poj 2570 Fiber Network Floyd

Description Several startup companies have decided to build a better Internet, called the "FiberNet"...
  • is_cp
  • is_cp
  • 2014年08月17日 16:10
  • 494

poj2570&zoj1967Fiber Network(floyd+状态压缩)

题目请戳这里 题目大意:n个路由器,编号1-n,26个公司,编号a-z,路由器之间有一些有向边,边权为一个字符串,字符串由小写字母组成,表示字符串对应的公司能使这条边连通。现在给若干个查询,查询能使任...

POJ-2570 Fiber Network

Fiber Network Time Limit: 1000MS   Memory Limit: 65536K       Description...

POJ2570:Fiber Network

http://poj.org/problem?id=2570 题目看似与Floyd无关,但是我们可以用Floyd算法的思想去解决。在这里我们将每一位小写字母转化成对应的二进制位,刚好需要一个整型数据...

POJ 2570 Fiber Network(最短路 二进制处理)

题目翻译 一些公司决定搭建一个更快的网络,称为“光纤网”。他们已经在全世界建立了许多站点,这 些站点的作用类似于路由器。不幸的是,这些公司在关于站点之间的接线问题上存在争论,这样“光纤网”项目就被迫...
  • acvay
  • acvay
  • 2014年10月30日 22:15
  • 744
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2570 Fiber Network --floyd求传递闭包加位运算
举报原因:
原因补充:

(最多只允许输入30个字)