POJ-1847 Tram (dijkstra算法)

题目大意:

有一个火车站,里面有n条轨道,然后有n个轨道切换点。问最多切换几次,能从A轨道切换到B轨道。
每个轨道切换点能切换至m条轨道上,其中第一条可以切换的轨道不算切换次数,因为本来就是往那条轨道上运行过去。
如果不能从A轨道切换到B轨道,则输出-1。


算法分析:

这道题算是比较裸的dijkstra算法,当然还有其他算法。问题的关键是如何建边,其实很简单,这道题的边的权值只有1和0两种情况,0是切换点后面的第一条轨道,1是切换点后面剩下的其他轨道。这样建好边后就可以直接用很裸的dijkstra算法做了。


代码实现:

#include <stdio.h>
#include <string.h>

#include <iostream>
#include <algorithm>

#define MAXNUM 0x7fffffff

using namespace std;

int n;

int edge[110][110];
int minn[110];
bool statu[110];

int dijkstra(int begin, int end)
{
    for (int i = 1; i <= n; i++) {
        minn[i] = MAXNUM;
        statu[i] = false;
    }
    minn[begin] = 0;
    for (int i = 1; i < n; i++) {
        int index = begin;
        int maxtmp = MAXNUM;
        for (int j = 1; j <= n; j++) {
            if (!statu[j] && maxtmp > minn[j]) {
                maxtmp = minn[j];
                index = j;
            }
        }
        statu[index] = true;
        for (int j = 1; j <= n; j++) {
            if (edge[index][j] != -1 && minn[j] > minn[index] + edge[index][j]) {
                minn[j] = minn[index] + edge[index][j];
            }
        }
    }
    if (minn[end] == MAXNUM)
        return -1;
    else
        return minn[end];
}

int main()
{
    int begin, end;
    int x, to;

    while (scanf("%d%d%d", &n, &begin, &end) != EOF) {
        memset(edge, -1, sizeof(edge));
        for (int i = 1; i <= n; i++) {
            scanf("%d", &x);
            for (int j = 1; j <= x; j++) {
                scanf("%d", &to);
                if (j == 1)
                    edge[i][to] = 0;
                else
                    edge[i][to] = 1;
            }
        }
        printf("%d\n", dijkstra(begin, end));
    }

    return 0;
}


发布了53 篇原创文章 · 获赞 7 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章