Saito Asuka saiko!!!

有些走累了呢 有些走累了呢 虽然以那麼平凡的表现 来形容人生的漫长道路 想稍稍休息下呢 想稍稍休息下呢 时间每分每刻都这样残酷 将我紧拖著前行...

洛谷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;
}

posted @ 2018-11-19 17:57  斋藤飞鸟  阅读(317)  评论(0编辑  收藏  举报
动画加载完毕