intconst N = 2e5+10, M = 8e5+10; intconst INF = 0x3f3f3f3f; int h[N],d[N],visit[N]; int cnt = 0; //用于前向星建图 structNode { int v; //u->v中的v当前顶点 int w; //u->v的权值 int next;//下一个u->next }e[M]; inlinevoidadd(int u, int v, int w)//前向星建图 { //尽管有重边的时候,会保存所有重边 //入队列后,当最小的边重边出队列后会在vis中标记,因此后续的边出队列后将不会被处理 e[cnt].v = v; e[cnt].w = w; e[cnt].next = h[u]; h[u] = cnt++; } //定义一个结构体用于优先队列中比较,也可在此重载()运算符 structCmp { int w, v; Cmp(int ww, int vv):w(ww),v(vv) {} booloperator < (const Cmp a) const{ return w > a.w; } }; //也可通过pair<int,int>,需要注意的是要把权值w放于第一个Int中,并且在新建队列时第三个参数指定升序greater<pair<int,int> > /* typedef pair<int,int> PII; priority_queue<PII, vector<PII>, greater<PII>> heap; */
voiddijkstra() { memset(visit, 0, sizeof(visit)); memset(d, 0x3f, sizeof(d)); priority_queue<Cmp> q; q.push(Cmp(0,1)); d[1] = 0; while (q.size()) { int t = q.top().v; q.pop(); if (visit[t])continue; visit[t] = 1; if (t == n)break; for (int i = h[t]; ~i; i = e[i].next) { int v = e[i].v; int w = d[t] + e[i].w; if (d[v] > w ) { d[v] = w; q.push(Cmp(d[v],v)); } } } }
#include<iostream> #include<cmath> #include<cstdio> #include<queue> #include<algorithm> usingnamespacestd; intconst N = 110, M = 1e4+5; intconst INF = 0x3f3f3f3f; int h[N],d[N],visit[N]; int cnt = 0; //用于前向星建图 int n,start,des; structNode { int v; int w; int next; }e[M];
voidadd(int u, int v, int w) { e[cnt].v = v; e[cnt].w = w; e[cnt].next = h[u]; h[u] = cnt++; }
intspfa() { memset(visit, 0, sizeof(visit)); memset(d, 0x3f, sizeof(d)); queue<int> q; q.push(start); d[start] = 0; while (q.size()) { int t = q.front(); q.pop(); visit[t] = 0; for (int i = h[t]; ~i; i = e[i].next) { int v = e[i].v; int w = d[t] + e[i].w; if (d[v] > w ) { d[v] = w; if (!visit[v]) { q.push(v); visit[v] = 1; } } } } return d[des]; }
intmain() { memset(h, -1, sizeof(h)); scanf("%d%d%d", &n, &start, &des); for (int i = 1; i <= n; i++) { int num; scanf("%d", &num); int cnt = 1; while (num--) { int v; scanf("%d", &v); if (cnt == 1) add(i, v, 0); else add(i, v, 1); cnt++; } } int ans = spfa(); if (ans != INF)printf("%d\n",ans ); elseprintf("-1\n"); return0; }