acwing野餐规划

news/2024/11/20 10:44:59/

搜索与回溯算法
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#include<map>
map<string,int>ggbond;
struct node
{
    int a,b,c;
}ai[2000000];
int f[2000000];
int m,n,ans,res=0x3f3f3f3f;
int d[2000000],qi,qk;
bool cmp(node a,node b);
int find(int x);
void dfs(int a);
int main()
{
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        string a,b;int c;
        cin>>a>>b>>c;
        if(!ggbond.count(a))ggbond[a]=++n;
        if(!ggbond.count(b))ggbond[b]=++n;
        ai[i].a=ggbond[a],ai[i].b=ggbond[b],ai[i].c=c;
    }
    qk=ggbond["Park"];
    for(int i=1;i<=n;i++)
    f[i]=i;
    sort(ai+1,ai+1+m,cmp);
    scanf("%d",&qi);
    dfs(1);
    cout<<"Total miles driven: "<<res;
}
void dfs(int i)
{
    if(d[qk]>qi)
    return ;
    int gg=1;
    for(int i=1;i<n;i++)
    if(find(i)!=find(i+1))gg=0;
    if(gg)
    {
        res=min(res,ans);
        return ;
    }
    if(i==m+1)
    return ;
    int a=find(ai[i].a);
    int b=find(ai[i].b);
    if(a==b)
    {
        dfs(i+1);
        return ;
    }
    d[ai[i].b]++;
    d[ai[i].a]++;
    f[a]=b;
    ans+=ai[i].c;
    dfs(i+1);
    ans-=ai[i].c;
    f[a]=a;
    d[ai[i].b]--;
    d[ai[i].a]--;
    if(ai[i].a==qk||ai[i].b==qk)
    dfs(i+1);
}
bool cmp(node a,node b)
{
    return a.c<b.c;
}
int find(int x)
{
    if(f[x]==x)
    return f[x];
    return find(f[x]);
}
解析
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#include<map>
map<string,int>ggbond;
struct node
{
    int a,b,c;
}ai[2000000];//结构体记录边
int f[2000000];
int m,n,ans,res=0x3f3f3f3f;
int d[2000000],qi,qk;
bool cmp(node a,node b);
int find(int x);
void dfs(int a);
int main()
{
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        string a,b;int c;
        cin>>a>>b>>c;
        if(!ggbond.count(a))ggbond[a]=++n;
        if(!ggbond.count(b))ggbond[b]=++n;//map记录点的编号
        ai[i].a=ggbond[a],ai[i].b=ggbond[b],ai[i].c=c;
    }
    qk=ggbond["Park"];//记录Park的编号
    for(int i=1;i<=n;i++)
    f[i]=i;
    sort(ai+1,ai+1+m,cmp);
    scanf("%d",&qi);
    dfs(1);
    cout<<"Total miles driven: "<<res;
}
void dfs(int i)
{
    if(d[qk]>qi)
    return ;//如果停车过多,返回
    int gg=1;
    for(int i=1;i<n;i++)
    if(find(i)!=find(i+1))gg=0;
    if(gg)//如果每个点的find()均相同,则是可行解
    {
        res=min(res,ans);
        return ;
    }
    if(i==m+1)//i不能超过m+1;
    return ;
    int a=find(ai[i].a);
    int b=find(ai[i].b);
    if(a==b)
    {
        dfs(i+1);//如果他们的find()相同,则跳过
        return ;
    }
    d[ai[i].b]++;
    d[ai[i].a]++;
    f[a]=b;
    ans+=ai[i].c;
    dfs(i+1);
    //以下为回溯
    ans-=ai[i].c;
    f[a]=a;
    d[ai[i].b]--;
    d[ai[i].a]--;
    if(ai[i].a==qk||ai[i].b==qk)//如果与Park相连,选择一遍,不选一遍
    dfs(i+1);
}
bool cmp(node a,node b)
{
    return a.c<b.c;
}
int find(int x)
{
    if(f[x]==x)
    return f[x];
    return find(f[x]);//这里不能写作f[x]=find(f[x]),否则无法回溯;
}

作者:马良
链接:https://www.acwing.com/solution/content/57107/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://www.ppmy.cn/news/286546.html

相关文章

真人CS、趣味拓展、空中断桥、越野车、露营 2天亲子活动方案

真人CS、趣味拓展、空中断桥、越野车、露营 2天亲子活动方案 时间安排 项目安排 第一天 08:00-09:30 集合&#xff0c;清点人数&#xff0c;乘车前往指定拓展基地 09:30-12:00 团队熔炼&#xff1a;破冰分组、团队建设、团队展示 挑战项目&#xff1a;亲子CS 12:00-13…

Matlab中pickic_中英双语小猪佩奇学英语Picnic野餐

Picnic 野餐 It is a lovely bright sunny day. 今天的天气阳光明媚。 Peppa and her family are going for a picnic. 佩奇和她的家人准备去野餐。 Daddy Pig is bringing the picnic basket. 猪爸爸拿着野餐篮子。 Picnic basket, bread, cheese, tomatoes and lemonade. 里面…

希尔顿旗下酒店于不同城市推出餐饮外卖、连住套餐、星厨上门、户外野餐等无忧安心产品...

上海2022年3月18日 /美通社/ -- 在暂时去不了远方的这个春天&#xff0c;希尔顿集团旗下酒店以诠释待客之道的热诚和酒店人的细心周到&#xff0c;及时调整业务&#xff0c;于不同城市推出一系列无忧安心的新产品、新体验&#xff0c;包括餐饮外卖、连住套餐、星厨上门、户外野…

Matlab中pickic_高颜值甜品DIY |春季甜品Picnic野餐系列,一起过个惬意慵懒的午后时光❗️...

前言 春季宅在家玩什么&#xff1f;把自家后院草坪利用起来&#xff0c;来一个慵懒又惬意的下午茶&#xff0c;吃着自己做的美味甜品和水果&#xff0c;喝着果香汽水&#xff0c;看着孩子们在院子里嬉闹玩耍的画面&#xff0c;原来幸福可以这么简单。 删除注释 图片来自布拉格之…

拍摄的风景视频中,如何快速有效地去除视频中的杂物?

我们在外游玩拍摄的短视频&#xff0c;视频中出现的不必要杂物&#xff0c;比如垃圾、广告或其他不相关的人&#xff0c;会影响视频内容的传达&#xff0c;会降低视频的观感质量。 因此&#xff0c;需要去除这些杂物&#xff0c;使得视频更加干净、整洁。让观众更容易理解视频的…

TikTok选品有什么技巧?

一、多平台选品逻辑 首先要知道一点&#xff0c;在独立站热卖的产品也会在亚马逊热卖&#xff0c;而Tiktok已经成为一个最初的舆情传播口&#xff0c;那么选品逻辑是&#xff1a; 1. 脸书爆款帖子产品 2. 速卖通本周本月趋势产品 3. 亚马逊24小时热销 4. 谷歌趋势对应产品…

野餐规划(最小度限制生成树)

题目 题目描述 一群小丑演员&#xff0c;以其出色的柔术表演&#xff0c;可以无限量的钻进同一辆汽车中&#xff0c;而闻名世界。 现在他们想要去公园玩耍&#xff0c;但是他们的经费非常紧缺。 他们将乘车前往公园&#xff0c;为了减少花费&#xff0c;他们决定选择一种合…

郊游活动

题面&#xff1a; 有 n 名同学参加学校组织的郊游活动&#xff0c;已知学校给这 n 名同学 的郊游总经费为 A 元&#xff0c;与此同时第 i 位同学自己携带了 Mi 元。为了方便郊 游&#xff0c;活动地点提供 B(≥n)辆自行车供人租用&#xff0c;租用第 j 辆自行车的价格为 Cj 元…