zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    flask-login
    python3安装scrapy框架
    Redis--对象共享(整数型字符串)
    Redis--对象(type、encoding、ptr、lru、refcount)
    Redis--内存回收(引用计数法)
    Redis--跳跃表
    Redis--压缩列表(节约内存,连锁更新)
    Redis--整数集合(升降级)
    Redis--Rehash(h[0],h[1],rehashIdx, 渐进式)
    Redis--解决Hash表键冲突(单向链表next指针,表头)
  • 原文地址:https://www.cnblogs.com/wish-all-ac/p/12967744.html
Copyright © 2011-2022 走看看