这题对最短路小小的变形,普通的最短路权值在边上,而这道题权值在点上!所以,代模板也要讲究技巧,具体表现在对dis[x]值的初始化上,具体看代码,最好画图理解透彻!
//复杂度O(n^2)
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string>
#include <deque>
#include <stack>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
#include <time.h>
#include <string.h>
using namespace std;
int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
#define LL long long
#define PI acos(-1.0)
#define N 2001
#define Max INT_MAX
#define Min INT_MIN
#define eps 1e-8
#define FRE freopen("a.txt","r",stdin)
struct node{
int x,y;
int val;
}p[N];
int g[N][N];
bool vis[N];
int dis[N];
int n,m;
bool chk(node a,node b){
if( b.x>a.y || b.y<a.x )
return false;
return true;
}
void disk(int x){
int i,j,k;
for(i=0;i<=n;i++){
vis[i]=0;
dis[i]=Max;
}
for(i=1;i<=n;i++){ //关键就在于初始化这里!
if(g[x][i]<Max)
dis[i]=g[x][i]+g[1][1];//与x有边的话就要加上x的值
else
dis[i]=g[x][i];
}
vis[x]=1;
dis[1]=g[1][1];
for(i=1;i<=n;i++){
int minm=Max;
k=0;
for(j=1;j<=n;j++){
if(!vis[j] && dis[j]<minm){
minm=dis[j];
k=j;
}
}
vis[k]=1;
for(j=1;j<=n;j++){
if(!vis[j] && g[k][j]<Max)
if(dis[k]+g[k][j]<dis[j])
dis[j]=dis[k]+g[k][j];
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int i,j,k;
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
g[i][j]=Max;
for(i=1;i<=n;i++){
scanf("%d %d %d",&p[i].x,&p[i].y,&p[i].val);
for(j=1;j<=i;j++){
if(chk( p[j], p[i])){
g[j][i]=p[i].val;
}
}
}
disk(1);
while(m--){
int a;
scanf("%d",&a);
if(dis[a]==Max)
printf("-1\n");
else
printf("%d\n",dis[a]);
}
}
return 0;
}