您的位置:首页 > 其它

poj2570 Fiber Network 最短路floyd

2013-10-07 19:15 375 查看
虽说是自己邪恶的,但是看了别人的思路,真是很巧妙的 位运算的应用,这道题目floyd只是个外壳,其实精华在于位运算,题目意思有点难理解 好好看,题意我也懒得写,复制了别人的  ,

题意:某条道路由一些公司修建,修建道路的公司可以提供这条路上的连通,询问哪些公司可以提供从A到B的路径.每个公司由一个小写字母表示。

思路:因为只有26个字母 所以可能用二进制去表示每个公司 1表示该路径上有该公司 比如说 1-->3 这条路径上有 abc这三个公司 则mat[1][3]  二进制表示为00..0111; 然后就是用floyd传递闭包。

#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>

#define ll long long
#define LL __int64
const ll INF=9999999999999;

using namespace std;

#define M 400000100

#define inf 0xfffffff

//vector<int,int> G[20002];
//vector<pair<int,int>> ::iterator iter;

//map<ll,int>mp;
//map<ll,int>::iterator p;

int mp[212][212];

void clear()
{
memset(mp,0,sizeof(mp));
}

int main(void)
{
int n;
bool flag=false;
while(scanf("%d",&n),n)
{
clear();
int u,v;
char s[26];
for(int i=0;;i++)
{
scanf("%d %d",&u,&v);
if(u+v == 0)
break;
scanf("%s",s);
for(int j=0;j<strlen(s);j++)
{
mp[u][v]|=1<<(s[j]-'a');
}
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j]=mp[i][j]|(mp[i][k]&mp[k][j]);
scanf("%d %d",&u,&v);
while(u!=0 && v!=0)
{
if(mp[u][v])
{
for(int i=0;i<26;i++)
{
if(mp[u][v]&(1<<i))
printf("%c",i+'a');
}
}
else
printf("-");
puts("");
scanf("%d %d",&u,&v);
}
puts("");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: