听灌多
  • 板块灌水区
  • 楼主_Liyx_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/29 11:25
  • 上次更新2024/10/29 16:25:27
查看原帖
听灌多
1041884
_Liyx_楼主2024/10/29 11:25

AT_abc302_f

#include<bits/stdc++.h>
using namespace std;
#define N 500005
#define mp make_pair
#define INF 0x3f
struct edge{
	int v,w;
};
int n,m,a,s;
vector<edge> g[N+N];
int dis[N+N],vis[N];
priority_queue<pair<int,int> > q;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a;
		for(int j=1;j<=a;j++){
			cin>>s;
			g[i].push_back({n+s,0});
			if(s!=1) g[n+s].push_back({i,1});
			else g[n+s].push_back({i,0});
		}
	}
	for(int i=1;i<=n+m;i++) dis[i]=INF;
	q.push(mp(0,n+1));
	dis[n+1]=0;
	vis[n+1]=1;
	while(!q.empty()){
		int u=q.top().second;
		vis[u]=1;
		q.pop();
		for(auto ed:g[u]){
			int v=ed.v,w=ed.w;
			if(vis[v]) continue;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push(mp(-dis[v],v));
			}
		}
	}
	if(dis[n+m]==INF) cout<<-1;
	else cout<<dis[n+m];
	return 0;
}

逆天wa

2024/10/29 11:25
加载中...