64pts,求调,玄关
查看原帖
64pts,求调,玄关
1189662
hujianyue_i楼主2024/11/28 10:36
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=300,M=3010;

struct node {
	int v,w,id;
};

bool check[N],vis[N];
int dis[N],t,z,num,x,y,n,m,q,k,ans;
vector <int> e[M],g[N];
vector <node> edge[N];
set <int> h;

void di(int u){
	dis[u]=0;
	for (int j=0;j<g[u].size();j++){
		h.insert(g[u][j]);
	}
	for (int i=1;i<n;i++){
		int p=0;
		for (int j=1;j<=n;j++){
			if (!vis[j] && (p==0 || dis[j]<dis[p])){
				p=j;
			}
		}
		for (int j=0;j<g[p].size();j++){
			h.insert(g[p][j]);
		}
		vis[p]=1;
		for (int j=0;j<edge[p].size();j++){
			int v=edge[p][j].v;
			int w=edge[p][j].w;
			int id=edge[p][j].id;
			bool f=0;
			for(int j=0;j<e[id].size();j++){
				if (h.find(e[id][j])==h.end()){
					f=1;
					break;
				}
			}
			if(f==0){
				dis[v]=min(dis[v],dis[p]+w);
			}
		}
	}
}

signed main (){
	memset(dis,0x1f,sizeof dis);
	cin>>n>>m>>q>>k;
	for (int i=1;i<=k;i++){
		cin>>x>>y;
		for (int j=1;j<=y;j++){
			cin>>num;
			g[x].push_back(num);
		}
	}
	for (int i=1;i<=m;i++){
		cin>>x>>y>>t>>z;
		edge[x].push_back({y,t,i});
		edge[y].push_back({x,t,i});
		for(int j=1;j<=z;j++){
			cin>>num;
			e[i].push_back(num);
		}
	}
	
	di(1);
	if(dis[n]>1e9){
		cout<<-1;
	}
	else{
		cout<<dis[n];
	}
	
	return 0;
}
2024/11/28 10:36
加载中...