题目链接:
http://poj.org/problem?id=2570
题目意思很简单,给你一个网路图,对于图上的站点,如果是可以连通的会标出可以修通从
i
站点到
分析
用
g[i][j][m]
表示对于公司
m
能修通从从
更加惊讶的是对没有优化的算法,把所有的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;
}