zoukankan      html  css  js  c++  java
  • [spfa]SSL 1693 香甜的黄油

    传送门

    Description

      农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。
      农夫John很狡猾。像以前的Pavlov,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。
      农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)

    题解

    这题其实folyd就可以跑过
    路径都是**双向边!!** 
    所以我们可以处理完一边,再将另一边直接赋值即可
    

    代码

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int inf=99999999;
    int n,p,c,num[801],d[801][801],ans,u,v,x,sum;
    int main()
    {
        scanf("%d%d%d",&n,&p,&c);
        for (int i=1;i<=p;i++)
            for (int j=1;j<=p;j++)
                if (i==j) d[i][j]=0;
                else d[i][j]=inf;
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            num[x]++;
        }
        for (int i=1;i<=c;i++)
        {
            scanf("%d%d%d",&u,&v,&x);
            d[u][v]=x; d[v][u]=x;
        }
        for (int k=1;k<=p;k++)
            for (int i=1;i<=p;i++)  
                for (int j=1;j<i;j++)
                    if (d[i][j]>d[i][k]+d[k][j])
                    {
                        d[i][j]=d[i][k]+d[k][j];
                        d[j][i]=d[i][j];
                    }
        ans=inf;
        for (int i=1;i<=p;i++)
        {
            int sum=0;
            for (int j=1;j<=p;j++) sum+=d[i][j]*num[j];
            if (ans>sum) ans=sum;
        }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    【NOI2005T4】聪聪和可可-期望DP+记忆化搜索
    总结:最大权闭合子图
    【NOI2009T4】植物大战僵尸-最大权闭合子图+拓补排序
    codevs 1090 加分二叉树
    codevs 1503 愚蠢的宠物
    codevs 1992 聚会
    welcome to new life
    codevs 1066 引水入城
    codevs 2021 中庸之道
    POJ 2104 K-th Number
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412249.html
Copyright © 2011-2022 走看看