您的位置:首页 > 其它

hdu - 2851 Lode Runner (最短路)

2015-06-03 15:53 288 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2851

首先有n层,每层的路径都有一个起点和终点和对应的危险值,如果某两层之间有交集,就能从这一层上到另外一层,不过只能上不能下.

给定m个目标点求出到目标点的最小危险值.

因为权值不一样,所以不能用bfs,dijkstra就好。

建图 就是把所有相连的边处理出来,因为读入是对y排序的.然后以此dijkstra就能求出所有点的最小花费。

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 2010;
const int INF = 1<<30;
int n,m;
struct node
{
int x,y,cost;
}f[maxn];

struct edge
{
int to,cost;
edge(){}
edge(int x,int y) {
to=x;
cost=y;
}
};
typedef pair<int,int>P;
vector<edge>G[maxn];
int d[maxn];
void dijkstra(int s)
{
priority_queue<P,vector<P>,greater<P> >que;
for(int i=1;i<=maxn;i++) d[i]=INF;
d[s]=f[1].cost;
que.push(P(f[1].cost,s));

while(!que.empty())
{
P p=que.top();que.pop();
int v=p.second;
if(d[v]<p.first) continue;
for(int i=0;i<G[v].size();i++)
{
edge e=G[v][i];
if(d[e.to]>d[v]+e.cost)
{
d[e.to]=d[v]+e.cost;
que.push(P(d[e.to],e.to));
}
}
}
}

int main()
{
//freopen("a.txt","r",stdin);
int t,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
G[i].clear();
scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].cost);
}
//printf("%d\n",n);
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
if(f[j].x<=f[i].y)
{
G[i].push_back(edge(j,f[j].cost));
// printf("%d %d %d\n",i,j,p[i].cost+p[j].cost);
}
}
dijkstra(1);
for(int i=0;i<m;i++)
{
scanf("%d",&k);
if(d[k]==INF) printf("-1\n");
else
printf("%d\n",d[k]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: