• Buy a Ticket,题解


    题目连接

    题意:

      没个位置有一个点权,每个边有一个边权,求对于每个点u的min(2*d(u,v)+val[v])(v可以等于u)

    分析:

      我们想这样一个问题,从u到v的边权*2再加一个点权就完了,我们能不能把点权也变成边权,可以,直接和0连接就好了,这是从u到0的最短路(当然原先的边权要*2)就是要求的值.

      当然,也可以直接类似dij的贪心思想,把每个点的dis赋值为点权push进去然后更新就行了.其实是类似的算法.

      代码:

      

    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int maxn=2e5+10;
    int vis[maxn];
    long long dis[maxn];
    struct E{
        int to;
        int next;
        long long val;
    }ed[maxn*3];
    int tot;
    int head[maxn];
    void J(int a,int b,long long c){
        tot++;
        ed[tot].to=b;
        ed[tot].val=c;
        ed[tot].next=head[a];
        head[a]=tot;
    }
    struct Node{
        long long dis;
        int x;
        friend bool operator < (Node a,Node b){
            return a.dis>b.dis;
        }
        Node(int a,long long b){
            x=a;
            dis=b;
        }
    };
    priority_queue<Node> qu;
    int main(){
        int n,m;
        scanf("%lld%lld",&n,&m);
        int js1,js2;
        long long js3;
        for(int i=1;i<=m;i++){
            scanf("%lld%lld%lld",&js1,&js2,&js3);
            J(js1,js2,2ll*js3);
            J(js2,js1,2ll*js3);
        }
        for(int i=1;i<=n;i++){
            scanf("%lld",&js3);
            J(0,i,js3);
        }
        memset(dis,0x3f,sizeof(dis));
        dis[0]=0ll;
        qu.push(Node(0,0ll));
        while(!qu.empty()){
            Node js=qu.top();
            qu.pop();
            if(vis[js.x])
                continue;
            vis[js.x]=1;
            for(int i=head[js.x];i;i=ed[i].next){
                int to=ed[i].to;
                long long di=js.dis+ed[i].val;
                if(dis[to]>di){
                    dis[to]=di;
                    qu.push(Node(to,di));
                }
            }
        }
        for(int i=1;i<=n;i++)
            printf("%lld ",dis[i]);
        return 0;
    }
  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/wish-all-ac/p/12967744.html
Copyright © 2020-2023  润新知