zoukankan      html  css  js  c++  java
  • butter

    题目描述

    农夫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),当然,连接是双向的

     

    输出格式:

     

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

     

    输入输出样例

    输入样例
    3 4 5
    2
    3
    4
    1 2 1
    1 3 5
    2 3 7
    2 4 3
    3 4 5
    输出样例
    8

    说明

    {样例图形

              P2  
    P1 @--1--@ C1
             |
             | 
           5  7  3
             |   
             |     C3
           C2 @--5--@
              P3    P4

    } {说明:

    放在4号牧场最优

    }

    因为数据范围也给的很小,所以我们也是枚举所有的点,然后分别求距离和,最后取min。

    关于分别求距离和,我们可以先初始化每一个点到所有点的路径长度,最后加和。

    所以若用spfa的话时间复杂度O(nve) 或O(n^2)。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<iostream>
     6 #include<queue>
     7 #include<vector>
     8 using namespace std;
     9 typedef long long ll;
    10 const int maxn = 2e3 + 5;
    11 const int INF = 0x3f3f3f3f;
    12 int n, p, c;
    13 int nn[maxn];
    14 struct Graph
    15 {
    16     int id, cost;
    17 };
    18 vector<Graph> v[maxn];
    19 ll ans = 10000000;
    20 int dis[maxn][maxn];
    21 void init_all()
    22 {
    23     for(int i = 1; i < maxn - 5; ++i)
    24         for(int j = 1; j < maxn - 5; ++j) dis[i][j] = INF;
    25 }
    26 bool vis[maxn], done[maxn];
    27 void spfa(int s)            //dis : every point to each point
    28 {
    29     memset(vis, 0, sizeof(vis));
    30     memset(done, 0, sizeof(done));
    31     queue<int> q; q.push(s);
    32     dis[s][s] = 0; done[s] = vis[s] = 1;
    33     while(!q.empty())
    34     {
    35         int now = q.front(); q.pop(); done[now] = 0;
    36         for(int i = 0; i < (int)v[now].size(); ++i)
    37         {
    38             if(!vis[v[now][i].id])
    39             {
    40                 if(dis[s][now] + v[now][i].cost < dis[s][v[now][i].id])
    41                 {
    42                     dis[s][v[now][i].id] = dis[s][now] + v[now][i].cost;
    43                     if(!done[v[now][i].id])
    44                     {
    45                         q.push(v[now][i].id);
    46                         done[v[now][i].id] = 1;
    47                     }
    48                 }
    49             }
    50         }
    51     }
    52 }
    53 int main()
    54 {
    55     freopen("butter.in", "r", stdin);
    56     freopen("butter.out", "w", stdout);
    57     init_all();
    58     scanf("%d%d%d", &n, &p, &c);
    59     for(int i = 1; i <= n; ++i) 
    60     {
    61         int x; scanf("%d", &x);
    62         nn[x]++;
    63     }
    64     for(int i = 1; i <= c; ++i)
    65     {
    66         int a, b, cost; scanf("%d%d%d", &a, &b, &cost);
    67         v[a].push_back((Graph){b, cost});        //无向图 
    68         v[b].push_back((Graph){a, cost});
    69     }
    70     for(int i = 1; i <= p; ++i) spfa(i);        //初始化每一个点到其他点的最短路 
    71     for(int i = 1; i <= p; ++i)
    72     {
    73         ll sum = 0;
    74         for(int j = 1; j <= p; ++j) sum += nn[j] * dis[j][i];    //距离和 
    75         if(sum < ans) ans = sum;
    76     }
    77     printf("%lld
    ", ans);
    78     return 0;
    79 }
  • 相关阅读:
    hdu4417 Super Mario
    bzoj3110 zjoi2013 K大数查询
    转:如何理解c和c ++的复杂类型声明
    UVa 489 刽子手游戏
    bzoj1006 神奇的国度
    bzoj2764 基因补全
    bzoj2338 数矩形
    bzoj3720 gty的妹子树
    Struts2(一)入门及工作原理
    输入人民币/美元后自动判断,输出转换后相对应的值
  • 原文地址:https://www.cnblogs.com/mrclr/p/8824921.html
Copyright © 2011-2022 走看看