http://acm.hust.edu.cn/vjudge/contest/121378#problem/N
题意:一辆火车从某点A开向某点B,在这一路上,有很多的岔口,默认的是第一条岔口,若想改变岔口的方向,则可以通过开关来改变,问你到达最终地点B时,一共改变开关的次数为多少。
**********单源求最短路问题(一开始写成双向的,我也是很无语很受伤啊)
#include<stdio.h> #include<string.h> #include<math.h> #include<queue> #include<algorithm> using namespace std; #define maxn 110 #define oo 0x3f3f3f3f int maps[maxn][maxn], v[maxn], dist[maxn]; int n, a, b; void Init() { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i==j) maps[i][j] = 0; else maps[i][j] = maps[j][i] = oo; } } } void Dij() { memset(v, 0, sizeof(v)); for(int i=1; i<=n; i++) dist[i] = maps[a][i]; v[a] = 1; for(int i=1; i<n; i++) { int index=-1, mins=oo; for(int j=1; j<=n; j++) { if(!v[j] && dist[j]<mins) { index=j; mins=dist[j]; } } v[index] = 1; for(int j=1; j<=n; j++) { if(!v[j] && dist[j]>mins+maps[index][j]) dist[j] = mins+maps[index][j]; } } if(dist[b] == oo) printf("-1 "); else printf("%d ", dist[b]); } int main() { int num, c; scanf("%d %d %d", &n, &a, &b); Init(); for(int i=1; i<=n; i++) { scanf("%d", &num); for(int j=1;j<=num; j++) { scanf("%d", &c); int p = 1; if(j == 1) p = 0; maps[i][c] = min(p, maps[i][c]); } } Dij(); return 0; }