• spfa邻接表版本


    热浪洛谷oj1339

    题目描述 Description

    德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。
        FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过T (1 <= T <= 2,500)个城镇,方便地标号為1到T。除了起点和终点外地每个城镇由两条双向道路连向至少两个其它地城镇。每条道路有一个通过费用(包括油费,过路费等等)。
        给定一个地图,包含C (1 <= C <= 6,200)条直接连接2个城镇的道路。每条道路由道路的起点Rs,终点Re (1 <= Rs <= T; 1 <= Re <= T),和花费(1 <= Ci <= 1,000)组成。求从起始的城镇Ts (1 <= Ts <= T)到终点的城镇Te(1 <= Te <= T)最小的总费用。
     输入输出格式 Input/output
    输入格式: 第一行: 4个由空格隔开的整数: T, C, Ts, Te
    第2到第C+1行: 第i+1行描述第i条道路。有3个由空格隔开的整数: Rs, Re和Ci 输出格式: 一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。
     输入输出样例 Sample input/output
    样例测试点#1
    输入样例: 在线IDE
    输出样例:
     说明 description
    【样例说明】
    5->6->1->4 (3 + 1 + 3)
    spfa

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    #define rep(i,n) for(int i=0;i<n;i++)
    #define clr(x,c) memset(x,c,sizeof(x))
    #define adde(u,v,d) add(u,v,d),add(v,u,d)
    const int nmax=2510;
    const int maxn=6205<<1;
    const int inf=0x3f3f3f3f;
    struct edge{
      int to,dist;
      edge*next;
    };
    edge edges[maxn],*pt,*head[nmax];
    int d[nmax],v[nmax];
    void add(int u,int v,int d){
       pt->to=v;
       pt->dist=d;
       pt->next=head[u];
       head[u]=pt++;
    }
    int main(){
       int n,m,i,j,k,l,s,t;
       cin>>n>>m>>s>>t;
       pt=edges;
       clr(head,0);
       rep(i,m){
         cin>>j>>k>>l;
         adde(j,k,l);
       }
       queue<int>q;
       q.push(s);
       clr(v,0);
       rep(i,n+1) d[i]=inf;
       v[s]=0;
       d[s]=0;
       while(!q.empty()){
          int u=q.front();
          q.pop();
          v[u]=0;
          for(edge*o=head[u];o;o=o->next){
             int to=o->to;int di=o->dist;
             if(d[to]>d[u]+di){
               d[to]=d[u]+di;
               if(!v[to]){
                 q.push(to);
                 v[to]=1;
               }
             }
          }
       }
       cout<<d[t]<<endl;
       return 0;
    }


    dijkstra

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cmath>
    using namespace std;
    #define rep(i,n) for(int i=0;i<n;i++)
    #define clr(x,c) memset(x,c,sizeof(x))
    #define adde(u,v,d) add(u,v,d),add(v,u,d)
    const int nmax=2505;
    const int maxn=6205<<1;
    const int inf=0x3f3f3f3f;
    struct edge{
      int to,dist;
      edge *next;
    };
    edge*head[nmax],*pt,edges[nmax];
    int d[nmax];
    void add(int u,int v,int d){
      pt->to=v;
      pt->dist=d;
      pt->next=head[u];
      head[u]=pt++;
    }
    struct node{
      int x,d;
      bool operator<(const node&rhs)const{
       return d>rhs.d;}
    };
    int main(){
       int n,m,i,j,k,l,s,t;
       cin>>n>>m>>s>>t;

      !!!!!!!!!pt=edges;!!!!!不用v数组来记录!!!和spfa的两个不同之处!!!!!
       clr(head,0);
       rep(i,m){
         cin>>j>>k>>l;
         adde(j,k,l);
       }
       rep(i,n+1) d[i]=inf;
       d[s]=0;
       priority_queue<node>q;
       q.push((node){s,0});
       while(!q.empty())
       {
         int x=q.top().x;
      int di=q.top().d;
      q.pop();
         for(edge* o=head[x];o;o=o->next){
           int to=o->to;
           int dist=o->dist;
           if(d[to]>di+dist){
             d[to]=di+dist;
             q.push((node){to,d[to]});
           }
         }
       }
       cout<<d[t]<<endl;
       return 0;
    }

  • 相关阅读:
    Springboot使用slf4j记录日志和lombok(能用的1)-主要看这个!
    mysql-覆盖索引(转载)(收藏过)
    Github上开源仿京东商城项目启动配置详解(小白版)
    java8 stream常用用法(转载)
    JDK下载过慢的问题解决方案
    intellij idea 的全局搜索快捷键方法(转载)
    Linux终端复制粘贴快捷命令
    Kali入门配置
    Google搜索
    Dig
  • 原文地址:https://www.cnblogs.com/20003238wzc--/p/4749671.html
Copyright © 2020-2023  润新知