一道简单的最短路。。。
我去题目样例看了好久,原来12345那些目标地是说的哪一个road啊,坑……注意一下这里的权值不是边的是点的,初始化cost的时候不小心写错了,用优化的dij应该会更快一些……真是心好累。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<cstring>
#include<algorithm>
#define INF 0X3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
const int maxn=2000+10;
bool vis[maxn];
int lowcost[maxn],cost[maxn][maxn];
int n,m;
struct node
{
int l,r,w;
} pp[maxn];
void dij(int beg)
{
for(int i=0; i<n; ++i)
{
lowcost[i]=INF;
vis[i]=false;
}
lowcost[beg]=0;
for(int j=0; j<n; ++j)
{
int k=-1;
int _min=INF;
for(int i=0; i<n; ++i)
if(!vis[i] && lowcost[i]<_min )
{
_min=lowcost[i];
k=i;
}
if(k==-1) break;
vis[k]=true;
for(int i=0; i<n; ++i)
if(!vis[i] && lowcost[k]+cost[k][i]<lowcost[i])
{
lowcost[i]=lowcost[k]+cost[k][i];
}
}
}
int main()
{
freopen("1.txt","r",stdin);
int kase;
scanf("%d",&kase);
while(kase--)
{
scanf("%d%d",&n,&m);
mem(cost,INF);
for(int i=0; i<n; ++i)
{
scanf("%d%d%d",&pp[i].l,&pp[i].r,&pp[i].w);
}
for(int i=0; i<n; ++i)
{
for(int j=i+1; j<n; ++j)
if(pp[i].r<=pp[j].r && pp[i].r>=pp[j].l)
cost[i][j]=pp[j].w;
}
dij(0);
for(int i=0; i<m; ++i)
{
int x;
scanf("%d",&x);
if(lowcost[x-1]!=INF)
printf("%d\n",lowcost[x-1]+pp[0].w);
else
printf("%d\n",-1);
}
}
return 0;
}