zoukankan      html  css  js  c++  java
  • 洛谷 P2126 Mzc家中的男家丁

    题目背景

    mzc与djn的…还没有众人皆知,所以我们要来宣传一下。

    题目描述

    mzc家很有钱(开玩笑),他家有n个男家丁,现在mzc要将她们全都聚集起来(干什么就不知道了)。现在知道mzc与男家丁们互相之间通信的时间,请算出把他们每个人叫到需要的总时间(要重复的哦)。保证能把他们每个人叫到。

    输入输出格式

    输入格式:

    第一行有一个数n,表示有n个男家丁。第二行一个数m表示有m条通信路线。之后m行,每行三个数a[i],b[i],c[i],表示第a[i]个男家丁(或mzc)和第b[i]个男家丁(或mzc)通信需要时间(双向)。ai=0表示mzc。

    输出格式:

    一行,一个数sum,表示把他们每个人叫到需要的总时间。

    输入输出样例

    输入样例#1:
    5
    12
    0 2 15
    2 3 20
    3 5 13
    1 3 29
    0 1 30
    2 4 21
    0 3 23
    5 1 48
    0 4 17
    0 5 27
    1 2 43
    2 5 41
    
    输出样例#1:
    94
    

    说明

    n<=2300

    m<=2300000

    屠龙宝刀点击就送

    裸Prim 难以理解为什么不用取最小边 

    建边时 dj[x][y]=dj[y][x]=min(dj[x][y],z)  会全WA 。

    直接赋值 会AC 。

    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    
    #define inf 0x7fffffff
    #define Max 3300
    using namespace std;
    
    bool vis[Max];
    int ans=0,Min[Max],dj[Max][Max],n,m;
    int main()
    {
        memset(dj,1,sizeof(dj));
        scanf("%d%d",&n,&m);
        for(int x,y,z;m--;)
        {
            scanf("%d%d%d",&x,&y,&z);
            dj[x][y]=dj[y][x]=z;
        }
        memset(Min,1,sizeof(Min));
        Min[0]=0;
        for(int i=0;i<=n;++i)
        {
            int u,minx=inf;
            for(int j=0;j<=n;++j)
            {
                if(!vis[j]&&Min[j]<minx)
                {
                    u=j;
                    minx=Min[j];
                }
            }
            vis[u]=1;ans+=minx;
            for(int j=1;j<=n;++j)
            if(!vis[j]&&dj[u][j]<Min[j])
            Min[j]=dj[u][j];
        }
        printf("%d",ans);
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    百度--买帽子
    网易--双核处理器
    京东--通过考试
    简单错误记录
    链表中的倒数第k个结点
    数值的整数次方
    二进制中1的个数
    TCP 三次握手
    旋转数组的最小数字
    用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6622862.html
Copyright © 2011-2022 走看看