zoukankan      html  css  js  c++  java
  • codevs1557 热浪(堆优化dijkstra)

    1557 热浪

     

     时间限制: 1 s
     空间限制: 256000 KB
     题目等级 : 钻石 Diamond
     
     
    题目描述 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 Description

    第一行: 4个由空格隔开的整数: T, C, Ts, Te

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

    输出描述 Output Description

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

    样例输入 Sample Input

    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

    样例输出 Sample Output

    7

    数据范围及提示 Data Size & Hint

    5->6->1->4 (3 + 1 + 3)

    //堆优化dijkstra模板 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define maxn 500000
    #define inf 0x3f3f3f3f
    
    using namespace std;
    int dis[maxn],head[maxn],vis[maxn];
    int n,m,s,t,x,y,z,num,ans;
    struct node
    {
        int u,v,w,next;
        bool operator < (const node &a) const
        {
            return w>a.w;//最短路 
        }
    }e[maxn<<1],t1,t2;
    priority_queue<node>q;
    
    inline int init()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    inline void add(int u,int v,int w)
    {
        e[++num].u=u;
        e[num].v=v;
        e[num].w=w;
        e[num].next=head[u];
        head[u]=num;
    }
    
    void dijkstra(int s,int t)
    {
        for(int i=1;i<=n;i++)  dis[i]=inf;
        t1.u=s;t1.w=0;
        dis[s]=0;
        q.push(t1);
        while(!q.empty())
        {
            t1=q.top();q.pop();
            int u=t1.u;
            if(vis[u]) continue;//这两行比较神奇,放别地方就不对... 
            vis[u]=true;
            for(int i=head[u];i;i=e[i].next)
            {
                int to=e[i].v;
                if(dis[to]>dis[u]+e[i].w)
                {
                    dis[to]=dis[u]+e[i].w;
                    t2.u=to;t2.w=dis[to];
                    q.push(t2);
                }
            }
        }
    }
    
    int main()
    {
        n=init();m=init();
        s=init();t=init();
        for(int i=1;i<=m;i++)
        {
            x=init();y=init();z=init();
            add(x,y,z);add(y,x,z);
        }
        dijkstra(s,t);
        printf("%d
    ",dis[t]);
        return 0;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    今天面试一些程序员(新,老)手的体会
    UVA 10635 Prince and Princess
    poj 2240 Arbitrage
    poj 2253 Frogger
    poj 2485 Highways
    UVA 11258 String Partition
    UVA 11151 Longest Palindrome
    poj 1125 Stockbroker Grapevine
    poj 1789 Truck History
    poj 3259 Wormholes
  • 原文地址:https://www.cnblogs.com/L-Memory/p/6602074.html
Copyright © 2011-2022 走看看