題目大意:
有一個火車站,裏面有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;
}