zoukankan      html  css  js  c++  java
  • 洛谷1339 热浪(最短路模板)

    洛谷1339 热浪

    本题地址: http://www.luogu.org/problem/show?pid=1339

    题目描述

    德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。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)最小的总费用。

    输入输出格式

    输入格式:

    第一行: 4个由空格隔开的整数: T, C, Ts, Te
    第2到第C+1行: 第i+1行描述第i条道路。有3个由空格隔开的整数: Rs, Re和Ci

    输出格式:

    一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。

    输入输出样例

    输入样例#1:

    7 11 5 4

    2 4 2

    1 4 3

    7 2 2

    3 4 3

    5 7 5

    7 3 3

    6 1 1

    6 3 4

    2 4 3

    5 6 3

    7 2 1

    输出样例#1:

    7

    说明

    【样例说明】
    5->6->1->4 (3 + 1 + 3)

    【思路】

      最短路。

    【代码】(模板)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 using namespace std;
     5 
     6 const int maxn = 2500+10 , maxm=6200+10;
     7 const int INF=1<<30;
     8 struct Edge{
     9     int v,w,next;
    10 }e[maxm*2];
    11 int en,front[maxn];
    12 int n,m,s,t;
    13 
    14 inline void AddEdge(int u,int v,int w) {
    15     en++; e[en].v=v; e[en].w=w; e[en].next=front[u]; front[u]=en;
    16 }
    17 
    18 void SPFA();
    19 void Dijkstra();
    20 
    21 int main() {
    22     memset(front,-1,sizeof(front));
    23     scanf("%d%d%d%d",&n,&m,&s,&t);
    24     int u,v,w;
    25     for(int i=1;i<=m;i++) {
    26         scanf("%d%d%d",&u,&v,&w);
    27         AddEdge(u,v,w);
    28         AddEdge(v,u,w);
    29     }
    30     Dijkstra();
    31     return 0;
    32 }
    33 
    34 //SPFA 最坏O(nm) 实践性很好 
    35 //15ms
    36 void SPFA() {
    37     int inq[maxn],d[maxn];
    38     queue<int> q;
    39     memset(inq,0,sizeof(inq));
    40     for(int i=1;i<=n;i++) d[i]=INF;
    41     
    42     d[s]=0; inq[s]=1; q.push(s);
    43     while(!q.empty()) {
    44         int u=q.front(); q.pop(); inq[u]=0;
    45         for(int i=front[u];i>=0;i=e[i].next) {
    46             int v=e[i].v,w=e[i].w;
    47             if(d[v]>d[u]+w) {
    48                 d[v]=d[u]+w;
    49                 if(!inq[v]) {
    50                     inq[v]=1;
    51                     q.push(v);
    52                 }
    53             }
    54         }
    55     }
    56     printf("%d
    ",d[t]);
    57 }
    58 
    59 //Dijkstra O(mlogn)
    60 //496ms 
    61 struct HeapNode{
    62     int u,d;
    63     bool operator<(const HeapNode& rhs) const{
    64         return d<rhs.d;
    65     }
    66 };
    67 void Dijkstra() {
    68     int d[maxn];
    69     priority_queue<HeapNode> q;
    70     for(int i=1;i<=n;i++) d[i]=INF;
    71     
    72     d[s]=0;
    73     q.push((HeapNode){s,d[s]});
    74     while(!q.empty()){
    75         HeapNode x=q.top(); q.pop();
    76         int u=x.u;
    77         if(x.d != d[u]) continue;
    78         for(int i=front[u];i>=0;i=e[i].next){
    79             int v=e[i].v,w=e[i].w;
    80             if(d[u]+w<d[v]) {
    81                 d[v]=d[u]+w;
    82                 q.push((HeapNode){v,d[v]});
    83             }
    84         }
    85     }
    86     printf("%d
    ",d[t]);
    87 }
  • 相关阅读:
    jQuery的事件处理
    《CSS mastery》 读书笔记
    javascript 基础三
    javascript 基础二
    webpack全局引入jquery的方法
    解决mongoVue的collections不显示问题
    javascript 实现一个回文数字
    nth-child和:nth-of-type的区别
    iscroll5实现一个下拉刷新上拉加载的效果
    js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4906531.html
Copyright © 2011-2022 走看看