您的位置:首页 > 其它

POJ 2570 Fiber Network

2010-10-29 19:51 253 查看
我觉得是一道不错的题目,题目不难,但是考验基本功

无非是用Floyd传递闭包,但由于数据量比较大,一开始用的暴力方法储存公司标记(是字符,不是字符串),结果超时了

后来看了DISCUSS,说用位运算,茅塞顿开

还有读取数据的时候用字符读,要小心空格!

位运算是个好东西啊,对于表示有或无,求交和并很方便,且速度快

代码:

#include<iostream>
#include<string>
using namespace std;
int g[205][205];
int get(char x)
{
return x-'a'+1;
}
char get2(int x)
{
return char(x+'a'-1);
}
int main()
{
int n,i,j,k,a,b,p,q,t;
char com;
while(cin>>n&&n)
{
memset(g,0,sizeof(g));
while(scanf("%d %d",&a,&b)&&a&&b)
{
getchar();
while(scanf("%c",&com)&&com!=10)
{
t=get(com);
g[a][b]|=1<<t;
}
}
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(g[i][k]&g[k][j])
g[i][j]|=g[i][k]&g[k][j];
}
}
while(scanf("%d %d",&a,&b)&&a&&b)
{
if(g[a][b]!=0)
{
i=0;
t=g[a][b];
while(t)
{
if(t&1)
printf("%c",get2(i));
t>>=1;
i++;
}
printf("/n");
}
else
printf("-/n");
}
printf("/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: