zoukankan      html  css  js  c++  java
  • 洛谷 题解 P1828 【香甜的黄油 Sweet Butter】

    潇洒の开始

    第一步:食用头文件和定义变量,

    变量干什么用的说的很清楚

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,p,c,i,j,x,y,t,min1,head,tail,tot,u;
    int a[801][801],b[501],dis[801],num[801],w[801][801],team[1601];//team为队列,dis为距离,num为邻接点个数,a存相邻点
    bool exist[801];//exist是存在的意思,确定某个元素是否存在
    int main()

    第二步:正常的输入

        cin>>n>>p>>c;//奶牛数,牧场数,牧场间的道路数
        for(i=1; i<=p; i++)
        {
            b[i]=0;
            num[i]=0;
            for(j=1; j<=p; j++)
                w[i][j]=0x7fffffff/3;//第i到第j个牧场的路程初始化为无穷
        }

    将两点之间的距离变为超大超大的数,酱紫好比较的啦

    第三步:正常的输入加存储

    for(i=1; i<=n; i++)
            cin>>b[i];//输入奶牛所在的牧场号
        for(i=1; i<=c; i++) //邻接矩阵存储,采用循环队列能够降低队列大小,队列长度只需开到2*n+5即可。
        {
            cin>>x>>y>>t;//相连牧场AB和两牧场间的距离
            w[x][y]=t;//保存x到y间的距离
            a[x][++num[x]]=y;//存相邻点,在num原有的基础上加一,并将y点存入
            a[y][++num[y]]=x;//存相邻点,在num原有的基础上加一,并将x点存入
            w[y][x]=w[x][y];//因为是双向连通的,所以两牧场间的距离相等
        }

    详细解释代码里面说的很清楚了,在啰嗦一下,双向的很重要

    用地接斯科拉的哥们们注意了。

    第四步:初始化minn

    min1=0x7fffffff/3;//初始化min

    最后一步:gao chao 预警

    for(i=1; i<=p; i++)
        {
            for(j=1; j<=p; j++) dis[j]=0x7fffffff/3;
            //memset(team,0,sizeof(team));                         //队列数组初始化
            //memset(exist,false,sizeof(exist));                   //exist标志初始化
            dis[i]=0;
            team[1]=i;
            head=0;
            tail=1;
            exist[i]=true;      //起始点入队
            while(head!=tail)
            {
                head++;
                head=((head-1)%1601)+1;                           //循环队列处理
                u=team[head];
                exist[u]=false;
                for(j=1; j<=num[u]; j++) //num数组储存的为当前点所相邻的点的个数
                    if (dis[a[u][j]]>dis[u]+w[u][a[u][j]])
                    {
                        dis[a[u][j]]=dis[u]+w[u][a[u][j]];
                        if (!exist[a[u][j]])//如果该点没有被拿出,就进行处理
                        {
                            tail++;
                            tail=((tail-1)%1601)+1;
                            team[tail]=a[u][j];
                            exist[a[u][j]]=true;//拿出该数
                        }
                    }
                }
            tot=0;
            for(j=1; j<=n; j++)
                tot+=dis[b[j]];//累加路程并计算
            if (tot<min1) min1=tot;//找最小
        }
        cout<<min1;
        return 0;

    初始化我是去掉了,因为定义在int main()外面是不需要再次清零的

    然后就是类似手打的队列,挨个比较找到小的就马上替换,重要的是没有被用过就处理

    再就是挨个比较找最小值就好了

    完整代码:

    完整代码

    完美の结束

    (这是我之前做的题,现在才拿出来写题解忘得差不多了,写的不好请多多谅解QWQ) (看的这么累,不点个赞再走)

  • 相关阅读:
    详解Webpack-dev-server的proxy用法
    .sync修饰符
    [Vue]createElement参数
    ElementUi学习笔记
    A5000项目阅读笔记
    webpack学习-10天搞定webpack4
    bhuilder 采坑日记-大小写问题
    angularjs:$$animateJs is not a function 错误
    webpack4 Cannot find module '@babel/core'
    算法-图论-最短路径-Dijsktra算法
  • 原文地址:https://www.cnblogs.com/acioi/p/11295011.html
Copyright © 2011-2022 走看看