1 solutions

  • 0
    @ 2025-11-5 17:30:33

    C++ :

    #define MAXN 3010UL
    #define MAXM 70010UL
    
    #define ll long long
    
    #include <cstdio>
    #include <vector>
    #include <cstring>
    
    ll dx[MAXN];
    
    struct Edge{
    	int v,nx;ll w;
    };
    
    Edge edge[MAXM];
    
    int n,m,headlist[MAXN],ec;
    
    std::vector<int> prt[MAXN],bst[MAXN];
    
    bool ex[MAXN];
    
    inline void Add_Edge(int u,int v,ll w){
    	edge[++ec].v=v;
    	edge[ec].w=w;
    	edge[ec].nx=headlist[u];
    	headlist[u]=ec;
    	return;
    }
    
    inline bool Check(int p){
    	int s=bst[p].size();
    	for(int i=0;i<s;i++) if(!ex[bst[p][i]]) return false;
    	return true;
    }
    
    int main(){
    	scanf("%d%d",&n,&m);memset(dx,0x3f,sizeof(dx));ll t;
    	for(int i=1,a,b;i<=m;i++) scanf("%d%d%lld",&a,&b,&t),Add_Edge(a,b,t);
    	for(int i=1,s,r;i<=n;i++){
    		scanf("%d",&s);
    		for(int j=0;j<s;j++)scanf("%d",&r),prt[r].push_back(i),bst[i].push_back(r);
    	}
    	dx[1]=0;
    	for(int i=1;i<=n;i++){
    		ll Min=0x7fffffff;int p;
    		for(int j=1;j<=n;j++) if(!ex[j]&&dx[j]<Min&&Check(j)) Min=dx[j],p=j;  
    		ex[p]=1;int s=prt[p].size();
    		if(p==n){
    			printf("%lld",dx[n]);return 0;
    		}
    		for(int i=headlist[p];i;i=edge[i].nx) if(dx[edge[i].v]>dx[p]+edge[i].w) dx[edge[i].v]=dx[p]+edge[i].w;
    		for(int i=0;i<s;i++) if(dx[prt[p][i]]<dx[p]) dx[prt[p][i]]=dx[p];
    	}
    	return 0;
    }
    
    • 1

    Information

    ID
    18499
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By