竟然是最短路!!!!
藏的好深啊
/* 求从路1走到路i的最小危险值, 给出n条路的起点和终点,当i,j两路有重合的,我们使map[i][j]=v[j]; 把路当作最短路中的点,如果有重合的map[i][j]=v[j]; 否则,map[i][j]=inf; 之后按照最短路的求法就可以了,注意最后要加上v[1]; */ #include"stdio.h" #include"string.h" #define N 2011 #define inf 999999999 struct node { int a,b,c; }A[N]; int map[N][N]; int n,m; int dis[N]; int mark[N]; void dijk() { int i,j,min,k; memset(mark,0,sizeof(mark)); for(i=1;i<=n;i++) dis[i]=map[1][i]; mark[1]=1; for(i=1;i<n;i++) { min=inf;k=-1; for(j=1;j<=n;j++) { if(!mark[j]&&min>dis[j]) { min=dis[j]; k=j; } } if(k==-1)break; mark[k]=1; for(j=1;j<=n;j++) { if(!mark[j]&&dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } } } int main() { int T; int i,j; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) map[i][j]=inf; map[i][i]=0; } for(i=1;i<=n;i++) scanf("%d%d%d",&A[i].a,&A[i].b,&A[i].c); for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { if(A[i].b>=A[j].a&&A[j].b>=A[i].b) map[i][j]=A[j].c; } } dijk(); int a; while(m--) { scanf("%d",&a); if(dis[a]<inf)printf("%d ",dis[a]+A[1].c); else printf("-1 "); } } return 0; }