首页 > 代码库 > POJ 1847 Tram 单源最短路径
POJ 1847 Tram 单源最短路径
题意:轨道网,有若干转换器,每个转换器都和其他若干转换器相连,转换器初始指向第一个与其相连的转换器。问要到达终点需要最少转换多少次?
思路:可以用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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。