1 #include<cstdio> 2 #include<iostream> 3 #define M 7009 4 #define ll long long 5 #define inf 1000000000 6 using namespace std; 7 int cnt,n,m,head[M],next[10*M],u[10*M],v[10*M],sum[M]; 8 int sum1[M],head1[M],next1[10*M],u1[10*M],f[M],cnt1,fr[M]; 9 int d[M],d1[M]; 10 void jia(int a1,int a2,int a3) 11 { 12 cnt++; 13 next[cnt]=head[a1]; 14 head[a1]=cnt; 15 u[cnt]=a2; 16 v[cnt]=a3; 17 return; 18 } 19 void jia1(int a1,int a2) 20 { 21 cnt1++; 22 next1[cnt1]=head1[a1]; 23 head1[a1]=cnt1; 24 u1[cnt1]=a2; 25 return; 26 } 27 int main() 28 { 29 scanf("%d%d",&n,&m); 30 for(int i=1;i<=m;i++) 31 { 32 int a1,a2,a3; 33 scanf("%d%d%d",&a1,&a2,&a3); 34 jia(a1,a2,a3); 35 } 36 for(int i=1;i<=n;i++) 37 { 38 scanf("%d",&sum[i]); 39 for(int j=1;j<=sum[i];j++) 40 { 41 int a1; 42 scanf("%d",&a1); 43 jia1(a1,i); 44 } 45 } 46 for(int i=1;i<=n;i++) 47 d[i]=inf; 48 d[1]=0; 49 for(int i=1;i<=n;i++) 50 { 51 int minn=inf,min1; 52 for(int j=1;j<=n;j++) 53 if(!f[j]&&sum1[j]==sum[j]) 54 { 55 int a1=max(d[j],d1[j]); 56 if(minn>a1) 57 { 58 minn=a1; 59 min1=j; 60 } 61 } 62 f[min1]=1; 63 d[min1]=minn; 64 if(f[n]) 65 break; 66 for(int j=head[min1];j;j=next[j]) 67 if(d[u[j]]>minn+v[j]) 68 { 69 d[u[j]]=minn+v[j]; 70 fr[u[j]]=min1; 71 } 72 for(int j=head1[min1];j;j=next1[j]) 73 { 74 sum1[u1[j]]++; 75 d1[u1[j]]=max(d1[u1[j]],minn); 76 } 77 } 78 int b1=n; 79 printf("%d ",d[n]); 80 return 0; 81 }
跑DJ每次找最小值更新时,看保护他的是否全找完了。