您的位置:首页 > 其它

POJ 1847 - Tram

2017-09-06 16:03 337 查看
题目大意:有N个开关,第i个开关就是将第i条路转向其他路的开关。要从A到B,最少需要转几次开关。每一个开关输出第一个数K,表示这个开关可以转向K条路,第一条不需要转开关,其他的K-1条都需要转一次开关才能转换到。

解题思路:数据量小,用floyd,每个开关的第一条路,权值为0,其他权值为1。最后输出A到B的最小权值即可,如果没有这样的一种方式,也就是A到B的权值为初始化的inf,则输出-1。

ac代码:
#include <iostream>
#include <cmath>
#define inf 105
using namespace std;
int n, A, B, w[105][105], t1, t2;
int main()
{
while (scanf("%d%d%d", &n, &A, &B)!=EOF){
for (int i=1; i<=n; i++){
for (int j=1; j<=n; j++)
w[i][j] = inf;
w[i][i] = 0;
}
for (int i=1; i<=n; i++){
scanf("%d", &t1);
for (int j=0; j<t1; j++){
scanf("%d", &t2);
if (!j)
w[i][t2] = 0;
else
w[i][t2] = min(w[i][t2], 1);
}
}
for (int k=1; k<=n; k++)
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
w[i][j] = min(w[i][j], w[i][k]+w[k][j]);
if (w[A][B] >= inf)
printf("-1\n");
else
printf("%d\n", w[A][B]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: