zoukankan      html  css  js  c++  java
  • T2038 香甜的黄油 codevs

    时间限制: 1 s
    空间限制: 128000 KB
    题目等级 : 钻石 Diamond
     
    题目描述 Description

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

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

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

    输入描述 Input Description

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

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

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

    输出描述 Output Description

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

    样例输入 Sample Input
    3 4 5
    2
    3
    4
    1 2 1
    1 3 5
    2 3 7
    2 4 3
    3 4 5
    样例图形
             P2  
    P1 @--1--@ C1
            |
            | 
          5  7  3
            |   
            |     C3
          C2 @--5--@
             P3    P4
    样例输出 Sample Output
    8
    {说明: 放在4号牧场最优. }
    数据范围及提示 Data Size & Hint

    见描述

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <queue>
    
    using namespace std;
    
    queue<int>que;
    int A,B,D,d[801][801],f[801][801];
    int pla[801],dis[801],num[801];
    bool vis[801];
    int n,p,c;
    
    int main()
    {
        cin>>n>>p>>c;
        for(int i=1;i<=p;i++)
            for(int j=1;j<=p;j++)
                d[i][j]=0x7fffffff/3;
        for(int i=1;i<=n;i++)
            cin>>pla[i];
        for(int i=1;i<=c;i++)
        {
            cin>>A>>B>>D;
            d[A][B]=d[B][A]=D;
            f[A][++num[A]]=B;
            f[B][++num[B]]=A;
        }
        int minn=0x7fffffff/3;
        for(int i=1;i<=p;i++)
        {
            for(int j=1;j<=p;j++) dis[j]=0x7fffffff/3;
            memset(vis,0,sizeof(vis));
            dis[i]=0;
            que.push(i),vis[i]=1;
            while(!que.empty())
            {
                int x=que.front(); que.pop(), vis[x]=0;
                for(int j=1;j<=num[x];j++)
                {
                    if(dis[f[x][j]]>dis[x]+d[x][f[x][j]])
                    {
                        dis[f[x][j]]=dis[x]+d[x][f[x][j]];
                        if(!vis[f[x][j]])
                        {
                            vis[f[x][j]]=1;
                            que.push(f[x][j]);
                        }
                    }
                }
            }
            int tot=0;
            for(int j=1;j<=n;j++)
                tot+=dis[pla[j]];
            if(minn>tot)
                minn=tot;
        }
        printf("%d",minn);
        return 0;
    }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Java HttpClient使用小结
    【剑指offer】Q18:树的子结构
    poj3041-Asteroids , 二分图的最小顶点覆盖数 = 最大匹配数
    jquery.validate+jquery.form提交的三种方式
    &quot;undefined reference to&quot; 问题解决方法
    [Oracle]
    Effective_java之二:慎用重载函数
    C99规范
    迭代、递归替代循环
    1)Linux程序设计入门--基础知识
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6501895.html
Copyright © 2011-2022 走看看