一道简单的最短路。。。
我去题目样例看了好久,原来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; }
时间: 2024-12-05 12:34:20