HDU--2851(最短路)

来源:互联网 发布:mac os沙盒 编辑:程序博客网 时间:2024/06/04 18:16

一道简单的最短路。。。

我去题目样例看了好久,原来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;}


0 0
原创粉丝点击