zoukankan      html  css  js  c++  java
  • [BZOJ 1579] Revamping Trails

    [题目链接]

             https://www.lydsy.com/JudgeOnline/problem.php?id=1579

    [算法]

            dist[u][k]表示当前在点u,升级了k条道路,最短路径的长度

            dijkstra即可

    [代码]

            

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 100010
    #define MAXM 50010
    #define MAXK 25
    
    int i,n,m,k,u,v,w,tot;
    int dist[MAXN][MAXK];
    int head[MAXN];
    
    struct edge
    {
            int to,w,nxt;
    } e[MAXM << 1];
    inline void addedge(int u,int v,int w)
    {
            tot++;
            e[tot] = (edge){v,w,head[u]};
            head[u] = tot;
    }
    inline void dijkstra()
    {
            int i,v,w;
            static bool visited[MAXN][MAXK];
            pair<int,int> cur;
            priority_queue< pair<int,pair<int,int> > > q;
            memset(visited,false,sizeof(visited));
            memset(dist,0x3f,sizeof(dist));
            dist[1][0] = 0;
            q.push(make_pair(0,make_pair(1,0)));
            while (!q.empty())
            {
                    cur = q.top().second;
                    q.pop();
                    if (visited[cur.first][cur.second]) continue;
                    visited[cur.first][cur.second] = true;
                    for (i = head[cur.first]; i; i = e[i].nxt)
                    {
                            v = e[i].to;
                            w = e[i].w;
                            if (dist[cur.first][cur.second] + w < dist[v][cur.second])
                            {
                                    dist[v][cur.second] = dist[cur.first][cur.second] + w;
                                    q.push(make_pair(-dist[v][cur.second],make_pair(v,cur.second))); 
                            }
                            if (cur.second < k && dist[cur.first][cur.second] < dist[v][cur.second + 1]) 
                            {
                                    dist[v][cur.second + 1] = dist[cur.first][cur.second];
                                    q.push(make_pair(-dist[v][cur.second + 1],make_pair(v,cur.second + 1)));
                            }
                    }
            }
    }
    int main() 
    {
            
            scanf("%d%d%d",&n,&m,&k);
            for (i = 1; i <= m; i++)
            {
                    scanf("%d%d%d",&u,&v,&w);
                    addedge(u,v,w);
                    addedge(v,u,w);
            }
            dijkstra();
            printf("%d
    ",dist[n][k]);
            
            return 0;
        
    }
  • 相关阅读:
    MySQL
    php抽象类和接口
    php面向对象三大特征
    php面向对象
    Git
    css3属性
    数据渲染
    ajax(2)
    ajax笔记
    作用域面试题
  • 原文地址:https://www.cnblogs.com/evenbao/p/9372278.html
Copyright © 2011-2022 走看看