• Highway Project--ZOJ3946(最短路SPFA)


    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5718

    题目大意: n个点  m条边   每条边有一个时间和花费   0点是起始点   从0点到各个点 的最短时间  时间相同的最小花费   

    还是做题少   到这种题 自己真的是一点思路都没

    用SPFA就可以  

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<math.h>
    #include<queue>
    #include<vector>
    #include<algorithm>
    #include<iostream>
    
    using namespace std;
    #define N 500050
    const double ESP = 1e-8;
    const long long INF = (1ll<<60)-1;
    #define memset(a,b) memset(a,b,sizeof(a))
    
    struct node
    {
        int v;
        long long cost,time;
        node(int v0=0, long long c=0, long long t=0) : v(v0),cost(c), time(t){}
    };
    
    vector<vector<node> >G;
    
    int vis[N];
    long long Time[N],Cost[N];
    int n,m;
    
    
    
    void SPFA()
    {
        memset(vis,0);
        for(int i=0;i<n;i++)
        {
            Time[i]=Cost[i]=INF;
        }
        Time[0]=Cost[0]=0;
        queue<int>Q;
        Q.push(0);
        while(!Q.empty())
        {
            int q=Q.front();
            Q.pop();
            vis[q]=0;///这个忘了写wa到哭
            int len=G[q].size();
            for(int i=0;i<len;i++)
            {
                node p=G[q][i];
                if(Time[p.v]>Time[q]+p.time || (Time[p.v]==Time[q]+p.time && Cost[p.v]>p.cost))
                {
                    Time[p.v]=Time[q]+p.time;
                    Cost[p.v]=p.cost;
                    if(!vis[p.v])
                    {
                        vis[p.v]=1;
                        Q.push(p.v);
                    }
                }
            }
        }
        long long int aa,bb;
        aa=bb=0;
        for(int i=1;i<n;i++)
        {
            aa+=Time[i];
            bb+=Cost[i];
        }
        printf("%lld %lld
    ",aa,bb);
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            
            scanf("%d %d",&n,&m);
            G.clear();
            G.resize(n+2);
            for(int i=0;i<m;i++)
            {
                int u,v;
                long long int time,cost;
                scanf("%d %d %lld %lld",&u,&v,&time,&cost);
                G[u].push_back(node(v,cost,time));
                G[v].push_back(node(u,cost,time));
            }
            SPFA();
        }
        return 0;
    }
  • 相关阅读:
    Web 日志分析过程
    nginx系列之九:lua服务
    Linux网络编程之IO模型
    从URL输入到页面展现到底发生什么
    CentOS 日常运维十大技能
    以MySQL为例,详解数据库索引原理(1)
    Elasticsearch的特点以及应用场景
    Ubuntu1804编译安装LNMP
    golang 高级
    Centos7 安装 Redis
  • 原文地址:https://www.cnblogs.com/linliu/p/5443876.html
Copyright © 2020-2023  润新知