[AtCoder-nikkei2019_2_qual_d] Shortest Path on a Line

[AtCoder-nikkei2019_2_qual_d] Shortest Path on a Line_第1张图片[AtCoder-nikkei2019_2_qual_d] Shortest Path on a Line_第2张图片

题目大致意思就是:

有一张有N个点,编号为1−N 的无向图

做M次操作 , 每次操作给出三个正整数L,R,C,对于每对 ≥L且≤R的整数对(S,T),在(S,T)之间添加一条长度为C的边

完成操作后,找出操作后无向图的最短路。

#include 
#include 
#include 
#include 
#include 
#define int long long

using namespace std;

typedef pair pii;
const int M=1000010;
int n,m;
bool st[M];
int dist[M];
int h[M],w[M],e[M],ne[M],idx;

void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

int dijkstra()
{
    memset(dist,0x3f,sizeof dist);
    memset(st,0,sizeof st);
    dist[1]=0;
    priority_queue,greater> heap;
    heap.push({0,1});
    while(heap.size())
    {
        auto t=heap.top();
        heap.pop();
        int ver=t.second,distance=t.first;
        if(st[ver]) continue;
        st[ver]=true;
        for(int i=h[ver];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>distance+w[i])
            {
                dist[j]=distance+w[i];
                heap.push({dist[j],j});
            }
        }
    }
    if(dist[n]==dist[0]) return -1;
    return dist[n];
}

signed main()
{
    cin>>n>>m;
    memset(h,-1,sizeof h);
    while(m--)
    {
        int l,r,c;
        cin>>l>>r>>c;
        add(l,r,c);
    }
    for(int i=n;i>1;i--) add(i,i-1,0);
    int t=dijkstra();
    printf("%lld\n",t);
    return 0;
}

此题关键点在于千万不要把[l,r)之间的所有点全建边,否则会re(别问我怎么知道的)附上发病因[AtCoder-nikkei2019_2_qual_d] Shortest Path on a Line_第3张图片

你可能感兴趣的:(图论,算法)