您的位置:首页 > 其它

POJ-1847 Tram (dijkstra算法)

2016-10-27 18:03 337 查看

题目大意:

有一个火车站,里面有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)

4000
edge[i][to] = 0;
else
edge[i][to] = 1;
}
}
printf("%d\n", dijkstra(begin, end));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: