Dijkstra算法模版 洛谷P1339 [USACO09OCT]热浪Heat Wave

题目描述

The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for good eating but are not so adept at creating creamy delicious dairy products. Farmer John is leading the charge to deliver plenty of ice cold nutritious milk to Texas so the Texans will not suffer the heat too much.

FJ has studied the routes that can be used to move milk from Wisconsin to Texas. These routes have a total of T (1 <= T <= 2,500) towns conveniently numbered 1..T along the way (including the starting and ending towns). Each town (except the source and destination towns) is connected to at least two other towns by bidirectional roads that have some cost of traversal (owing to gasoline consumption, tolls, etc.). Consider this map of seven towns; town 5 is the

source of the milk and town 4 is its destination (bracketed integers represent costs to traverse the route):

                          [1]----1---[3]-
                         /               \
                  [3]---6---[4]---3--[3]--4
                 /               /       /|
                5         --[3]--  --[2]- |
                 \       /        /       |
                  [5]---7---[2]--2---[3]---
                        |       /
                       [1]------

Traversing 5-6-3-4 requires spending 3 (5->6) + 4 (6->3) + 3 (3->4) = 10 total expenses.

Given a map of all the C (1 <= C <= 6,200) connections (described as two endpoints R1i and R2i (1 <= R1i <= T; 1 <= R2i <= T) and costs (1 <= Ci <= 1,000), find the smallest total expense to traverse from the starting town Ts (1 <= Ts <= T) to the destination town Te (1 <= Te <= T).

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

分析:
数据范围实测是3000个点以内(不要问我哪里知道的),显然floyd会炸掉,不假思索的写了个Dijkstra

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

    long map[3101][3101],cost[3101],flag[3101];
    long n,m,x,y;

void init()
{
    int i,j;
    scanf("%ld%ld%ld%ld",&n,&m,&x,&y);
    for(i=1;i<=n;++i)
    {
        cost[i]=1<<27;
        flag[i]=1;
        for(j=1;j<=n;++j)
            map[i][j]=1<<27;
    }
    for(i=1;i<=m;++i)
    {
        long a,b,c;
        scanf("%ld%ld%ld",&a,&b,&c);
        map[a][b]=c;
        map[b][a]=c;
    }
}

void dj()
{
    int i,j,tmp,mn;
    cost[x]=0;
    for(i=1;i<=n;++i)
    {
        mn=1<<27;
        tmp=0;
        for(j=1;j<=n;++j)
            if(flag[j] && cost[j]<mn)
            {
                mn=cost[j];
                tmp=j;
            }
        if(tmp)
        {
            flag[tmp]=0;
            for(j=1;j<=n;++j)
                if(flag[j] && cost[tmp]+map[tmp][j]<cost[j])
                    cost[j]=cost[tmp]+map[tmp][j];
        }
    }
}

int main(void)
{
    init();
    dj();
    printf("%ld",cost[y]);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值