题意:轨道网,有若干转换器,每个转换器都和其他若干转换器相连,转换器初始指向第一个与其相连的转换器。问要到达终点需要最少转换多少次?
思路:可以用dijkstra单源最短路来做,把轨道网看做有向图(因为1第一个指向2,2的第一个不一定指向1),当前转换器处始指向的那个转换器之间的路径权值为0,其他路径权值为1,求一次起点到终点的最短路,结果就是最少转换次数,注意可能没有路径,这时要输出-1
代码:
/* poj 1847 264K 0MS */ #include<cstdio> #include<cstring> #include<iostream> #define MAXN 105 #define MAX_INT 2147483647 using namespace std; int n,gra[MAXN][MAXN],dist[MAXN],sta,fin; void init() { memset(gra , -1 , sizeof(gra)); cin>>n>>sta>>fin; for(int i = 1;i <= n;i ++) { int m,t; cin>>m>>t; gra[i][t] = 0; for(int j = 1;j < m;j ++) { scanf("%d",&t); gra[i][t] = 1; } } memset(dist , 1 , sizeof(dist));//这样可以整体赋一个较大的值 dist[sta] = 0; } int dijkstra() { bool mark[MAXN] = {false}; for(int i = 1;i <= n;i ++) { int Min = MAX_INT,tj; for(int j = 1;j <= n;j ++) if(dist[j] < Min && !mark[j]) { Min = dist[j]; tj = j; } mark[tj] = true; for(int j = 1;j <= n;j ++) if(!mark[j] && gra[tj][j] > -1) dist[j] = min(dist[j] , dist[tj] + gra[tj][j]); } if(dist[fin] == dist[0]) return -1; return dist[fin]; } int main() { init(); cout<<dijkstra()<<endl; return 0; }
POJ 1847 Tram 单源最短路径,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u013687632/article/details/27332013