POJ - 1847 Tram

POJ - 1847 题目链接

思路

题意比较简单,关键在于如何转化为图的过程。

  • 首先,我们对条件进行分析n最大是100,那么这题极有可能是Floyd
  • 再而,切换开关需要的花费是1,每个开关链接着两个点,这里可以看作是一条边链接两个点。
  • 最后,确定边权值,切换开关边权值是1,不切换开关边权值是0,完成建图,跑一边floyd。

代码

//Powered by CK 2020/04/03
#include
#include
#include
#include
using namespace std;
const int N = 110;
const int INF = 0x3f3f33f;
int ans[N][N], rt, st, n;
void init() {
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if(i == j)  ans[i][j] = 0;
            else    ans[i][j] = INF;
}
void Floyd() {
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                ans[i][j] = min(ans[i][j], ans[i][k] + ans[k][j]);
    if(ans[rt][st] == INF)  puts("-1");
    else    printf("%d\n", ans[rt][st]);
}
int main() {
    // freopen("in.txt", "r", stdin);
    int x, y, w;
    while(scanf("%d %d %d", &n, &rt, &st) != EOF) {
        init();
        for(int i = 1; i <= n; i++) {
            int sum;
            scanf("%d", &sum);
            for(int j = 1; j <= sum; j++) {
                scanf("%d", &y);
                if(j == 1)  ans[i][y] = 0;
                else    ans[i][y] = 1;
         }
        }
        Floyd();
    }
    return 0;
}

你可能感兴趣的:(POJ - 1847 Tram)