1 solutions
-
0
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