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; }
相关文章推荐
- POJ 1847 Tram【最短路入门Dijkstra算法模板题目一】
- POJ 1847 Tram【最短路入门Dijkstra算法模板题目一】
- POJ 1847 Tram 笔记
- POJ 1847 Tram(Floyd)
- POJ 1847 Tram(floyd 最短路)
- POJ1847 Tram
- poj 1847 Tram 【最短路 dijkstra + floyd + spfa】
- POJ 1847 Tram(Dijkstra单源有向图最短路径算法)
- POJ-1847-Tram(裸迪杰斯特拉或弗洛伊德)
- POJ 1847 Tram 【最短路】
- poj 1847(Tram) Dijkstra
- (简单) POJ 1847 Tram,Dijkstra。
- POJ 1847 Tram(简单最短路之Floyd)
- POJ_1847_Tram(单源最短路径的三种算法实现)
- POJ 1847 Tram
- POJ 1847 Tram
- POJ_1847_Tram
- poj 1847 最短路径的dijkstra算法
- poj1847 Tram
- poj 1847 Tram