zoukankan      html  css  js  c++  java
  • poj1511【最短路spfa】

    题意:
    计算从源点1到各点的最短路之和+各点到源点1的最短路之和;

    思路:
    源点这个好做啊,可是各点到源点,转个弯就是反向建边然后求一下源点到各点的最短路,就是各点到源点的最短路,在两幅图里搞;

    贴一发挫code……….

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    typedef __int64 LL;
    
    const int INF=1000000000+10;
    const int N=1e6+10;
    
    struct asd{
        int to;
        int w;
        int next;
    };
    asd q[N*4];
    int head1[N*2],head2[N*2];
    int dis[N];
    bool vis[N];
    int tol;
    int n,m;
    int qq[N*10];//利用数组模拟队列...这样写更好哦~
    int s,t;
    
    LL spfa(int *head)
    {
        s=0;
        t=1;
        for(int i=1;i<=n;i++)
        {
            dis[i]=INF;
            vis[i]=0;
        }
        vis[1]=1;
        dis[1]=0;
        qq[s]=1;
    
        while(s<t)
        {
            int u=qq[s];s++;
            vis[u]=0;
            for(int v=head[u];v!=-1;v=q[v].next)
            {
                int i=q[v].to;
                if(dis[i]>dis[u]+q[v].w)
                {
                    dis[i]=dis[u]+q[v].w;
                    if(!vis[i])
                    {
                        vis[i]=1;
                        qq[t++]=i;
                    }
                }
            }
        }
        LL ans=0;
        for(int i=1;i<=n;i++)
            ans+=dis[i];
        return ans;
    }
    
    void init()
    {
        tol=0;
        memset(head1,-1,sizeof(head1));
        memset(head2,-1,sizeof(head2));
    }
    
    void add(int *head,int a,int b,int c)
    {
        q[tol].to=b;
        q[tol].w=c;
        q[tol].next=head[a]++;
        head[a]=tol++;
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int a,b,c;
            scanf("%d%d",&n,&m);
            init();
            for(int i=0;i<m;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                add(head1,a,b,c);
                add(head2,b,a,c);
            }
            printf("%lld
    ",spfa(head1)+spfa(head2));
        }
        return 0;
    }
  • 相关阅读:
    python直接赋值、浅拷贝与深拷贝的区别解析
    join shuffle
    Python工作流-Airflow
    【JAVA基础语法】(一)Arrays.asList的使用
    Java中的数组和List
    ArrayList和LinkedList区别
    Array和ArrayList区别
    iOS项目崩溃日志采集与分析
    iOS超全开源框架、项目和学习资料汇总
    iOS webView、WKWebView、AFNetworking 中的cookie存取
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934896.html
Copyright © 2011-2022 走看看