POJ-1847 Tram(最短路)
2017-03-30 11:41
381 查看
POJ-1847
N个站点,站点之间有轨道相连,但是站点只连向其可到的第一个站点,要到该站点可以到的其它站点需要使用转换轨道,问从A到B需要最少转换多少次
每个站到到其可达的第一个站点边权为0,其余可达的边权为1,显然不会经过同一个节点两次,直接选最短就好了
N个站点,站点之间有轨道相连,但是站点只连向其可到的第一个站点,要到该站点可以到的其它站点需要使用转换轨道,问从A到B需要最少转换多少次
每个站到到其可达的第一个站点边权为0,其余可达的边权为1,显然不会经过同一个节点两次,直接选最短就好了
// 显然不会经过同一个节点两次,直接选最短就好了 WA1 忘判-1 #include <cstdio> #include <algorithm> #include <queue> #include <cstring> using namespace std; typedef pair<int,int> PII; const int MAXN=222; const int MAXM=MAXN*MAXN/2; const int INF=0x3f3f3f3f; int head[MAXN],to[MAXM<<1],ne[MAXM<<1],wt[MAXM<<1],n,m,dist[MAXN],ecnt; void init() { ecnt=0; memset(head,0,sizeof(head)); } void addedge(int a,int b,int c) { ne[++ecnt]=head[a]; head[a]=ecnt; to[ecnt]=b; wt[ecnt]=c; } int vis[MAXN]; priority_queue<PII> pq; int dijkstra(int s,int t)//s为源点,t为终点,路径权值非负 { for(int i=1;i<=n;i++) dist[i]=INF,vis[i]=0; dist[s]=0; pq.push(PII(0,s)); while(!pq.empty()) { int milb=pq.top().second; pq.pop(); if(vis[milb]) continue; vis[milb]=1; for(int j=head[milb];j;j=ne[j]) { int v=to[j]; if(!vis[v]&&dist[v]>dist[milb]+wt[j]) { dist[v]=dist[milb]+wt[j]; pq.push(PII(-dist[v],v)); } } } return dist[t]; } int main() { int ta,tb,ss,tt; scanf("%d%d%d",&n,&ss,&tt); for(int i=1;i<=n;i++) { scanf("%d",&ta); for(int j=0;j<ta;j++) { scanf("%d",&tb); addedge(i,tb,j!=0); } } int ans; ans=dijkstra(ss,tt); if(ans==INF) ans=-1; printf("%d\n",ans); return 0; }
相关文章推荐
- Poj 1847 Tram ( 最短路变形
- poj 1847 Tram【spfa最短路】
- POJ-1847 Tram( 最短路 )
- poj 1847 Tram 最短路
- poj 1847 Tram (最短路)
- poj 1847 Tram (SPFA最短路)
- POJ 1847 Tram 【最短路】
- POJ 1847 Tram(简单最短路之Floyd)
- POJ 1847 Tram --set实现最短路SPFA
- poj-1847 Tram 最短路
- POJ 1847 Tram 【最短路,spfa算法,题意理解是关键呀!!】
- POJ 1847 Tram --set实现最短路SPFA
- POJ 1847 Tram (最短路)
- POJ-1847 Tram( 最短路 )
- (POJ 1847)Tram 简单最短路 spfa
- POJ 1847 tram 最短路 (Flord)
- poj 1847 Tram 【最短路 dijkstra + floyd + spfa】
- 最短路练习13/poj/1847 / Tram/floyd解法;memset用0x3f初始化详解
- POJ 1847 Tram 最短路
- POJ 1847 Tram(最短路)