洛谷P1346 电车|最短路径|重新建图
题目描述
思路
最短路水题
根据题意:
对于每个车站:
第一个出度的车站的权值为0
其余的权值为1
根据以上描述建图即可
代码
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#define inf 999999
using namespace std;
void read(int &n){
int num=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
num=num*10+ch-'0';
ch=getchar();
}
n=num*w;
}
const int maxn=105;
struct node{int v,w;};
vector<node> g[maxn];
int n,a,b;
void init(){
read(n);read(a);read(b);
for(int u=1;u<=n;u++){
int k;read(k);
for(int i=1;i<=k;i++){
int v;read(v);
g[u].push_back((node){v,i==1?0:1});
}
}
}
int dist[maxn],done[maxn];
void Dijkstra(int s){
for(int i=1;i<=n;i++) dist[i]=inf;
memset(done,0,sizeof(done));
dist[s]=0;
priority_queue<pair<int,int> >q;
q.push(make_pair(0,s));
while(!q.empty()){
int u=q.top().second;q.pop();
if(done[u]) continue;
done[u]=1;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(dist[v]>dist[u]+w){
dist[v]=dist[u]+w;
q.push(make_pair(-dist[v],v));
}
}
}
}
int main(){
init();
Dijkstra(a);
printf("%d",dist[b]!=inf?dist[b]:-1);
return 0;
}