zoukankan      html  css  js  c++  java
  • P1828 香甜的黄油 Sweet Butter (spfa)

    题目描述

    农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。

    农夫John很狡猾。像以前的Pavlov,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。

    农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)

    输入输出格式

    输入格式:
    第一行: 三个数:奶牛数N,牧场数(2<=P<=800),牧场间道路数C(1<=C<=1450)

    第二行到第N+1行: 1到N头奶牛所在的牧场号

    第N+2行到第N+C+1行: 每行有三个数:相连的牧场A、B,两牧场间距离D(1<=D<=255),当然,连接是双向的

    输出格式:
    一行 输出奶牛必须行走的最小的距离和

    输入输出样例

    输入样例#1: 复制
    3 4 5
    2
    3
    4
    1 2 1
    1 3 5
    2 3 7
    2 4 3
    3 4 5
    输出样例#1: 复制
    8
    说明

    {样例图形

          P2  
    

    P1 @–1–@ C1
    |
    |
    5 7 3
    |
    | C3
    C2 @–5–@
    P3 P4
    } {说明:

    放在4号牧场最优

    }

    spfa 模板

    code:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int INF=0x3f3f3f3f;
    int n,m,cnt,minn=INF,p,c;
    int que[4010],dis[801],hea[801],place[801];
    bool flag[801];
    struct edge{
        int to,next,mes;
    }edge[4010];
    
    void add_n(int x,int y,int z){
        edge[++cnt].next=hea[x];
        edge[cnt].to=y;
        edge[cnt].mes=z;
        hea[x]=cnt;
    }
    
    void spfa(int t){
        memset(flag,false,sizeof flag);
        memset(dis,INF,sizeof dis);
        int head=1,tail=1; 
        dis[t]=0;
        que[head]=t; 
        flag[t]=true;
        while(head<=tail){
            for(int i=hea[head[que]];i;i=edge[i].next){
                if(dis[edge[i].to]>dis[que[head]]+edge[i].mes){
                    dis[edge[i].to]=dis[que[head]]+edge[i].mes;
                    if(!flag[edge[i].to])
                        que[++tail]=edge[i].to;
                        flag[edge[i].to]=true;
                }
            }
            flag[que[head]]=false;
            head++;
        }
        int sum=0;
        for(int i=1;i<=n;i++) sum+=dis[place[i]];
        if(sum<minn) minn=sum;
    }
    
    int main()
    {
    //    freopen("testdata.txt","r",stdin);
        scanf("%d %d %d",&n,&p,&c);
        for(int i=1;i<=n;i++) 
            scanf("%d",&place[i]);
        for(int i=1;i<=c;i++){
            int x,y,z;
            scanf("%d %d %d",&x,&y,&z);
            add_n(x,y,z);
            add_n(y,x,z);
        }
        for(int i=1;i<=p;i++) 
            spfa(i);
        printf("%d",minn);
        return 0;
    }
    版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
  • 相关阅读:
    ★《唐琅探案》后记【2】
    ★《唐琅探案》后记【2】
    《OD学hadoop》第一周0625 LINUX作业一:Linux系统基本命令(一)
    《OD学hadoop》第一周0626
    《OD学hadoop》mac下使用VMware Fusion安装centos
    《OD学hadoop》第一周0625
    《OD学hadoop》第二阶段Java编程基础
    《OD学hadoop》Linux基础
    《OD学hadoop》Hadoop前置
    《OD学算法》常用算法集合
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9248038.html
Copyright © 2011-2022 走看看