首页 > 其他分享 >P9327 [CCC 2023 S4] Minimum Cost Roads

P9327 [CCC 2023 S4] Minimum Cost Roads

时间:2024-05-29 13:43:46浏览次数:20  
标签:node struct ll P9327 long S4 Minimum 2005 cmp

原题链接

题解

贪心,我管这种叫做策略贪心,即按照某种顺序或者角度去贪心可以得到最优解

既然题目要求任意两点间最短路最小的同时,价格也最小,那么我们就按长度为第一关键字,花费为第二关键字排序。然后遍历所有边看看这条边能否使用

遍历过程的策略:
如果这条边加入后,这条边两端的节点之间的距离不变。
如果变小了,便加入;此时需不需要去掉某条原先已经加入的边呢?不用,因为每条边都一定是其直接相连两点间长度最短且价格最少的边,不能去掉

code1(TLE)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxs=2e18;
struct node
{
    ll x,y,l,c;
}e[2005];

bool cmp(node a,node b)
{
    if(a.l!=b.l) return a.l<b.l;
    return a.c<b.c;
}

ll dis[2005][2004];
int main()
{
    ll n,m;
    cin>>n>>m;

    for(ll i=1;i<=m;i++)
    {
        cin>>e[i].x>>e[i].y>>e[i].l>>e[i].c;
    }

    sort(e+1,e+1+m,cmp);

    for(ll i=1;i<=n;i++)
    {
        for(ll j=1;j<=n;j++) dis[i][j]=maxs;
    }

    for(ll i=1;i<=n;i++) dis[i][i]=0;
    ll cost=0;
    for(ll i=1;i<=m;i++)
    {
        ll x=e[i].x,y=e[i].y,l=e[i].l,c=e[i].c;
        if(dis[x][y]>l)
        {
            //printf("edge %d:  x:%d y:%d l:%d c:%d \n",i,x,y,l,c);
            dis[x][y]=dis[y][x]=l;
            cost+=c;
            for(ll j=1;j<=n;j++)
            {
                for(ll k=1;k<=n;k++)
                {
                    dis[k][j]=min(dis[k][j],dis[k][x]+dis[y][j]+l);
                    dis[k][j]=min(dis[k][j],dis[k][y]+dis[x][j]+l);
                    dis[j][k]=dis[k][j];
                }
            }
        }
    }

    cout<<cost;
    return 0;
}

优化

考虑优化,发现对于遍历每条边的时候,我们只需要知道这条边两端节点的距离就行了,所以我们可以用 \(O(nlogm)\) 判断+ \(O(1)\) 更新 的最短路算法代替 \(O(1)\) 判断+ \(O(n^2)\) 更新的暴力算法
再度优化,当两个节点没有任何路径相连时,这条边一定加入,这里我们可以通过判断是否位于一个集合处理

总时间复杂度: \(O(m\frac{nlogm+logn}{2})\)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxs=2e18;
struct node
{
    ll x,y,l,c;
}e[2005];

bool cmp(node a,node b)
{
    if(a.l!=b.l) return a.l<b.l;
    return a.c<b.c;
}


ll fa[2005];
ll finds(ll now)
{
    return now==fa[now]?now:fa[now]=finds(fa[now]);
}

struct unit
{
    ll to,len;
};
vector<unit> G[2005];

struct fresh
{
    ll pos,val;
    bool operator<(const fresh&b) const
    {
        return b.val<val;
    }
};
ll n,m;
bool check(ll s,ll t,ll d)
{
    priority_queue<fresh> q;
    ll dis[2005];
    for(ll i=1;i<=n;i++) dis[i]=maxs;
    q.push({s,0});
    while(q.size())
    {
        ll now=q.top().pos,val=q.top().val;
        q.pop();
        if(now==t) return d<val;
        if(dis[now]<=val) continue;
        dis[now]=val;
        for(auto next:G[now])
        {
            ll to=next.to,len=next.len;
            if(dis[now]+len<dis[to])q.push({to,len+dis[now]});
        }
    }
    return true;
}

int main()
{
    cin>>n>>m;

    for(ll i=1;i<=n;i++) fa[i]=i;

    for(ll i=1;i<=m;i++)
    {
        cin>>e[i].x>>e[i].y>>e[i].l>>e[i].c;
    }

    sort(e+1,e+1+m,cmp);

    ll cost=0;
    for(ll i=1;i<=m;i++)
    {
        ll x=e[i].x,y=e[i].y,l=e[i].l,c=e[i].c;

        if(finds(x)!=finds(y)||check(x,y,l))
        {
            cost+=c;
            G[x].push_back({y,l});
            G[y].push_back({x,l});
            fa[finds(x)]=finds(y);
        }
    }

    cout<<cost;
    return 0;
}

标签:node,struct,ll,P9327,long,S4,Minimum,2005,cmp
From: https://www.cnblogs.com/pure4knowledge/p/18220102

相关文章

  • SAP S4HANA2023 PCE系统上的VKM3?
    SAPS4HANA 2023PCE系统上的VKM3?  在SAPS4HANA2023PCE系统上,试图执行事务代码VKM3,为某个销售订单释放客户信用冻结,系统报错:无法执行事务VKM3(SAPNote2476734),     详细报错信息: 无法执行事务VKM3(SAPNote2476734)消息编号00977诊断系统配置(黑......
  • P10298 [CCC 2024 S4] Painting Roads
    原题链接题解由易到难,先不考虑交替的事情,既然要尽量少的涂色,那么我最少要涂几条颜色的边?(由于图不一定联通,这里先考虑连通图的情况)如果一条边处于一个环内,那么这个边就可以不涂色。所以只要有环我就可以选择一条边不涂色,那么到最后,涂色的边构成一棵树接下来考虑这颗树能否实现......
  • SAP S4HANA 2023 PCE系统上ME23N界面里的打印预览功能不能使用?
    SAPS4HANA2023PCE系统上ME23N界面里的打印预览功能不能使用?  在老版本的SAPECC系统上,在采购订单的显示界面,我们是可以点击‘打印预览’按钮去看采购订单的打印效果的。这是一个有经验的MM模块顾问熟知的。 但是笔者的这个认知在SAPS4HANA2023PCE系统上被颠覆了!笔......
  • RS485通讯协议
    UART(通用异步收发器)是一种常见的串行通信接口协议,用于在计算机和外部设备之间传输数据RS485网关接收宿主机(Host)通过UART传过来的各类命令,执行相应的操作,并对执行结果做出应答。如果是转发到输出RS485通道的命令,则将发送到RS485口的数据体分离出来通过对应的RS485硬件通道发送......
  • CF1085D Minimum Diameter Tree 题解
    CF1085DMinimumDiameterTree题解比较水的一道绿题观察样例可以发现,边权都平分在叶子节点唯一的一条连边上,由此猜到联想到可以把贪心地将边权全部平均分配到这些边上,这样写出来就能AC了。如何证明先来一张图方便理解:利用反证法:假设按上述做法分配边权后可以至少修改一次......
  • ESP32+RS485参考代码要点+@环境esp-idf-v5.1.2 +vscode 草稿
    在环境esp-idf-v5.1.2+vscode 中,如何在一个文件内,调用另外一个文件夹内定义的函数。 设置帧内间隔(在传输线上,两个发送的字节之间的时间间隔,不超过3.5发送单个字节的时间。)通过函数esp_err_tuart_set_rx_timeout(uart_port_tuart_num,constuint8_ttout_thresh)实现此......
  • [LeetCode] Find the Minimum Cost Array Permutation
    Youaregivenanarray nums whichisa permutation of [0,1,2,...,n-1].The score ofanypermutationof [0,1,2,...,n-1] named perm isdefinedas:score(perm)=|perm[0]-nums[perm[1]]|+|perm[1]-nums[perm[2]]|+...+|perm[n-1]-......
  • 64 - Minimum Path Sum 最小路径和
    64-MinimumPathSum最小路径和问题描述Givenamxngridfilledwithnon-negativenumbers,findapathfromtoplefttobottomright,whichminimizesthesumofallnumbersalongitspath.Note:Youcanonlymoveeitherdownorrightatanypointinti......
  • Преимущества RS485 для сбора данных LoRaWAN
    СборщикданныхRS485toLoRaWAN—этосборщикданных,которыйиспользуетстандартныйпротоколLoRaWANдлябеспроводногоинтерфейсавосходящейлиниисв......
  • 消费电子产品数据安全芯片推荐-LCS4110R
    这些年来,我国消费电子的技术一直都在不断上升,很多知名品牌的消费电子都把生产基地建立在我国,成为了全球最大的消费电子的制造中心。同时我国消费电子的市场规模也在不断增大,这也让市场成熟度提高。我国不仅是最大的消费电子消费国,也是出口国。如何保障消费电子的版权及数据安全,可......