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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章