zoukankan      html  css  js  c++  java
  • USACO Chocolate Giving

    洛谷 P2984 [USACO10FEB]给巧克力Chocolate Giving

    洛谷传送门

    JDOJ 2680: USACO 2010 Feb Silver 2.Chocolate Giving

    JDOJ传送门

    Description

    Farmer John is distributing chocolates at the barn for Valentine's
    day, and B (1 <= B <= 25,000) of his bulls have a special cow in
    mind to receive a chocolate gift.

    Each of the bulls and cows is grazing alone in one of the farm's N
    (2*B <= N <= 50,000) pastures conveniently numbered 1..N and connected
    by M (N-1 <= M <= 100,000) bidirectional cowpaths of various lengths.
    Some pastures might be directly connected by more than one cowpath.
    Cowpath i connects pastures R_i and S_i (1 <= R_i <= N; 1 <= S_i
    <= N) and has length L_i (1 <= L_i <= 2,000).

    Bull i resides in pasture P_i (1 <= P_i <= N) and wishes to give a
    chocolate to the cow in pasture Q_i (1 <= Q_i <= N).

    Help the bulls find the shortest path from their current pasture
    to the barn (which is located at pasture 1) and then onward to the
    pasture where their special cow is grazing. The barn connects, one
    way or another (potentially via other cowpaths and pastures) to
    every pasture.

    As an example, consider a farm with 6 pastures, 6 paths, and 3 bulls
    (in pastures 2, 3, and 5) who wish to bestow chocolates on their
    love-objects:

                          *1  <-- Bull wants chocolates for pasture 1 cow
                 [4]--3--[5]  <-- [5] is the pasture ID
                /  |
               /   |
              4    2          <-- 2 is the cowpath length
             /     |               between [3] and [4]
          [1]--1--[3]*6
         /       /
        9     3  2
       /       /
     [6]      [2]*4
    

    * The Bull in pasture 2 can travel distance 3 (two different ways)
    to get to the barn then travel distance 2+1 to pastures [3] and
    [4] to gift his chocolate. That's 6 altogether.

    * The Bull in pasture 5 can travel to pasture 4 (distance 3), then
    pastures 3 and 1 (total: 3 + 2 + 1 = 6) to bestow his chocolate
    offer.

    * The Bull in pasture 3 can travel distance 1 to pasture 1 and then
    take his chocolate 9 more to pasture 6, a total distance of 10.

    Input

    * Line 1: Three space separated integers: N, M, and B

    * Lines 2..M+1: Line i+1 describes cowpath i with three
    space-separated integers: R_i, S_i, and L_i

    * Lines M+2..M+B+1: Line M+i+1 contains two space separated integers:
    P_i and Q_i

    Output

    * Lines 1..B: Line i should contain a single integer, the smallest
    distance that the bull in pasture P_i must travel to get
    chocolates from the barn and then award them to the cow of his
    dreams in pasture Q_i

    Sample Input

    6 7 3 1 2 3 5 4 3 3 1 1 6 1 9 3 4 2 1 4 4 3 2 2 2 4 5 1 3 6

    Sample Output

    6 6 10

    题目翻译:

    Farmer John有B头奶牛(1<=B<=25000),有N(2*B<=N<=50000)个农场,编号1-N,有M(N-1<=M<=100000)条双向边,第i条边连接农场R_i和S_i(1<=R_i<=N;1<=S_i<=N),该边的长度是L_i(1<=L_i<=2000)。居住在农场P_i的奶牛A(1<=P_i<=N),它想送一份新年礼物给居住在农场Q_i(1<=Q_i<=N)的奶牛B,但是奶牛A必须先到FJ(居住在编号1的农场)那里取礼物,然后再送给奶牛B。你的任务是:奶牛A至少需要走多远的路程?

    输入格式:

    第一行:三个用空格隔开的整数N,M和B。

    第二到M+1行:第i+1行用R_i,S_i和L_i三个用空格隔开的整数描述双向边i。

    第M+2到M+B+1行:第M+i+1行包含两个用空格隔开的整数P_i和Q_i。

    输出格式:

    第一到B行:第i行包括一个整数,居住在农场P_i的公牛从FJ那里取得情人节巧克力后送给他居住在农场Q_i的梦中情牛至少需要走的距离。

    题解:

    我觉得算是裸的最短路。

    这数据量用dij或者SPFA都是极好的。

    就是这个变量名非常不友好...

    NMB??

    不要在意这些细节。

    我们处理一遍SPFA就可以把dist数组处理出来,然后询问的时候去调用就可以。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    int n,m,b;
    int tot,to[200001],val[200001],nxt[200001],head[100001];
    int v[100001],dist[100001];
    void add(int x,int y,int z)
    {
        to[++tot]=y;
        val[tot]=z;
        nxt[tot]=head[x];
        head[x]=tot;
    }
    void spfa()
    {
        memset(dist,0x3f,sizeof(dist));
        memset(v,0,sizeof(v));
        queue<int> q;
        q.push(1);
        v[1]=1;
        dist[1]=0;
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            v[x]=0;
            for(int i=head[x];i;i=nxt[i])
            {
                int y=to[i];
                if(dist[y]>dist[x]+val[i])
                {
                    dist[y]=dist[x]+val[i];
                    if(v[y]==0)
                        q.push(y),v[y]=1;
                }
            }
        }
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&b);
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
            add(y,x,z);
        }
        spfa();
        for(int i=1;i<=b;i++)
        {
            int p,q;
            scanf("%d%d",&p,&q);
            int ans=dist[p]+dist[q];
            printf("%d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    使用jquery-qrcode生成二维码
    ASP.NET匿名对象与集合的使用
    ASP.NET Core 之跨平台的实时性能监控
    centos7如何将docker容器配置成开机自启动
    linux 查看系统信息命令
    基于.NET CORE微服务框架 -浅析如何使用surging
    Docker 两键创建 ZeroTier moon 节点
    kubernetes-dashboard获取令牌登陆
    docker环境下使用gitlab,gitlab-runner 为 NetCore 持续集成
    Docker For MYSQL 8.0 特别注意修复数据库新的验证方式
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11287988.html
Copyright © 2011-2022 走看看