zoukankan      html  css  js  c++  java
  • 【USACO】香甜的黄油

    这是一道来自USACO的题,一般歪果仁的题都不是很好做,就比如这题

    题目描述:

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

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

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

    那是候没有看到最后一行,于是乎就一不小心地写了个模拟woc 就入坑了,一分都没有拿到,惨啊啊啊啊啊

    于是我仔细看了看

    原来!!! 这道题就是一个非常简单的最短路吧,枚举一个点放糖,计算这个点到其他点的长度再乘以其他点的牛的数量。

    本来想用floyed的但怕超时也怕重蹈覆辙于是就没有打

    于是便打了spfa,过了

    OK,上代码

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 int n;
     7 int p;
     8 int c;
     9 int x,y;
    10 int t;
    11 int minl,head,tail,tot,u;
    12 int a[801][801],b[501],dis[801],num[801],w[801][801],team[1601];
    13 bool exist[801];
    14 int main() {
    15     scanf("%d %d %d",&n,&p,&c);
    16     for(int i=1; i<=p; i++) {
    17         b[i]=0;
    18         num[i]=0;
    19         for(int j=1; j<=p; j++) {
    20             w[i][j]=0x7fffffff/3;
    21         }
    22     }
    23     for(int i=1; i<=n; i++)
    24         scanf("%d",&b[i]);
    25     for(int i=1; i<=c; i++) {
    26         scanf("%d %d %d",&x,&y,&t);
    27         w[x][y]=w[y][x]=t;
    28         a[x][++num[x]]=y;
    29         a[y][++num[y]]=x;
    30     }
    31     minl=0x7ffffff/3;
    32     for(int i=1; i<=p; i++) {
    33         for(int j=1; j<=p; j++)
    34             dis[j]=0x7fffffff/3;
    35         memset(team,0,sizeof(team));
    36         memset(exist,false,sizeof(exist));
    37         dis[i]=0;
    38         team[1]=i;
    39         int head=0;
    40         int tail=1;
    41         exist[i]=true;
    42         do {
    43             head++;
    44             head=((head-1)%1601)+1;
    45             u=team[head];
    46             exist[u]=false;
    47             for(int j=1; j<=num[u]; j++)
    48                 if(dis[a[u][j]]>dis[u]+w[u][a[u][j]]) {
    49                     dis[a[u][j]]=dis[u]+w[u][a[u][j]];
    50                     if(!exist[a[u][j]]) {
    51                         tail++;
    52                         tail=((tail-1)%1601)+1;
    53                         team[tail]=a[u][j];
    54                         exist[a[u][j]]=true;
    55                     }
    56                 }
    57         } while(head!=tail);
    58         tot=0;
    59         for(int j=1; j<=n; j++)
    60             tot+=dis[b[j]];
    61         if(tot<minl) minl=tot;
    62     }
    63     printf("%d",minl);
    64     return 0;
    65 }
  • 相关阅读:
    中兴ZTE ZXV10 H618B超级密码
    星际1.08下载绝对能玩
    cs脚本
    关于JIRA4.3.3破解的问题,为什么我的就可以破解成功
    Jquery DataTables学习笔记(一)
    如何利用System.Net.Mail类发送EMAIL
    IE鼠标右键查看源文件失效解决办法
    ServU FTP Server远程/本地提升权限
    Laravel的homestead安装
    编程总结3
  • 原文地址:https://www.cnblogs.com/WestJackson/p/11344924.html
Copyright © 2011-2022 走看看