首页 > 其他分享 >11.22 CW 模拟赛 T2.通信

11.22 CW 模拟赛 T2.通信

时间:2024-11-22 18:24:04浏览次数:1  
标签:ch int 11.22 void T2 Num Now CW 边权

算法

显然的, 我们可以先转化问题
对于无向图上的 \(n\) 个点, 点之间的边权就是 \(\min(\text{图上的欧氏距离的平方和}, v)\) , 求走完所有点时经过的最小边权和

手玩样例看下有没有思路?

显然的, 对于 \(50 \rm{pts}\) , 状压可以解决

考虑剩下的 \(50 \rm{pts}\) , 注意到我们的目标是在完全图中掏一个长为 \(n\) 的环出来使得边权和最小, 显然可以状态压缩 , 由于是完全图, 状态膨胀非常快, 大概是 \(n^n\) 这一级的, 这一点也不好处理

顺着状压 \(\rm{dp}\) 往下走
注意到每一条边 \((u, v)\) 都可以更新 \(State_{without \ v \ and \ with \ u} \to State_{with \ v \ and \ with \ u}\)
考虑逆向处理
我们可以知道, 对于每一个点 \(v\) , 我们可以枚举其出边权值最小, 加在一起即可
但是这里有约束条件, 注意到如果 \(u\) 已经不在集合中, 我们不能使用 \((u, v)\)

所以我们要找出 \(n - 1\) 条边, 其中每个点作为终点只出现一次, 也就是说入度为 \(1\) , 并且要求边权和最小, 这是最小生成树的典型运用

然后就可以用最小生成树处理了, 注意起始点的边权应当设为 \(V\) , 因为第一个点必须空降而来

代码

#include <bits/stdc++.h>
using namespace std;

template <typename T>
inline void read(T &x)
{
    x = 0;
    char ch = getchar();
    while (ch < '0' or ch > '9')
        ch = getchar();
    while (ch >= '0' and ch <= '9')
        x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    return;
}

const int N = 5e3 + 10;

int n, V;
int x[N], y[N];

struct Edge
{
    int v, w;
};
vector<Edge> e[N];

inline int dis(int i, int j)
{
    return (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
}

inline void init()
{
    read(n), read(V);
    for (int i = 1; i <= n; ++i)
        read(x[i]), read(y[i]);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j < i; ++j)
        {
            if (i == j) continue;
            int d = dis(i, j);
            if (d < V)
                e[i].push_back({j, d}), e[j].push_back({i, d});
            else
                e[i].push_back({j, V}), e[j].push_back({i, V});
        }
    return;
}

long long ans = 0;
int tot = 0;


/*
inline void Kruskal()
{
    while (!e.empty())
    {
        auto x = e.top();
        e.pop();
        int f1 = find(x.u), f2 = find(x.v);
        if (f1 ^ f2)
        {
            ++tot, ans += x.w;
            fa[f1] = f2;
        }
    }
    return;
}
*/

bool down[N];
struct node
{
    int Num;
    int dis;

    friend bool operator < (const node &a, const node &b)
    {
        return a.dis > b.dis;
    }
};
priority_queue<node> Q;
void Prim()
{
    Q.push({1, V});
    while (!Q.empty())
    {
        node Now = Q.top();
        Q.pop();
        if (down[Now.Num]) continue;

        down[Now.Num] = true;
        ans += Now.dis;
        for (int i = 0; i < int(e[Now.Num].size()); i++) {
            int NowTo = e[Now.Num][i].v, NowW = e[Now.Num][i].w;
            if (down[NowTo]) continue;
            Q.push({NowTo, NowW});
        }
    }

    printf("%lld", ans);
}

inline void calculate()
{
    Prim();
    return;
}

inline void solve()
{
    init();
    calculate();
    return;
}

signed main()
{
    solve();
    return 0;
}

/*
6 1000
0 0
0 10
20 20
30 30
80 100
100 100

3200
*/

总结

通过部分分推正解方法是好的

善于转化问题

优化后的 \(\rm{Prim}\) 算法在稠密图中比未优化的慢

标签:ch,int,11.22,void,T2,Num,Now,CW,边权
From: https://www.cnblogs.com/YzaCsp/p/18562871

相关文章

  • EMC电磁兼容设计与测试案例分析(第3版)(11.22)
    EMC电磁兼容设计与测试案例分析(第3版)(11.22)EMC电磁兼容设计与测试案例:1、EMC共模电流不入地2、金属外壳可以更好接地、屏蔽线缆:单端/双端接地是否存在连接层导致双端失效3、电感频增而增;电容频增而减;串感、并荣;有概率发生谐振(点),应避开emc测试点4、浪涌与过压:低频、干扰......
  • 11.22 模拟赛
    前言大唐胜屎\(T1\)镜的绮想水签CODE#include<bits/stdc++.h>typedeflonglongll;usingnamespacestd;constintN=5e3+100;constintM=4e6+100;intn,m;structPoi{ intx,y;}a[N],b[N];intnum[M];signedmain(){ autoRet1=f......
  • 2024.11.18至2024.11.22周总结
    本周学习任务清单DP本周黄队详讲了DP有关知识的拓展,从本质到转移方式再到优化等。本质一般DP可以理解为DAG上推式子。特殊的可能需要解方程(直接解&高斯消元),以及图论(最短路,同余最短路)来解决。四大要素状态,最好是无后效性,把不能直接处理的&后面要用到的,都塞到状态里。......
  • 身边的创业者Part2:AI在垂类领域商业化落地和盈利(消费零售场景案例)| 专访爱莫AiMall创
    对多数AI创业公司而言,实现盈利是一道悬在半空的难题。这背后反映的实际问题是,当新的技术出现,或现有技术取得突破性进展时,如何将这些前沿技术迅速应用于真实的产业场景中,解决具体的需求,并产生商业价值。破题的方法多种多样,奇绩2021年春季创业营校友企业「爱莫科技」的探索......
  • 24.11.20 sevlet2
    1.servlet是否线程安全(线程特性)线程安全的指标//1.是否有共享数据//2.多线程对共享数据做写操作servlet中不要创建成员变量servlet是单实例的所以成员变量(不加static)就会在多线程间共享如果service()方法中对成员变量有写操作则线程不安全servlet中非特殊情况......
  • CPT205 Computer Graphics
    CPT205ComputerGraphics~1~CPT20T–ComputerGraphics(2024-25)Assessment2–3DModellingProjectAssessmentnumber2Contributiontooverallmoduleassessment15%DateonwhichassessmentgivenMonday,4November2024SubmissiondeadlineSunday,8Decembe......
  • 11.20 CW 模拟赛 赛时记录
    看题前言:花了\(10\rm{min}\)把昨天的题调了一下,神经\(\rm{T1}\)艹,再一次缺失大样例神秘博弈放\(\rm{T1}\),大抵可做(主要原因是\(\rm{lhs}\)键盘敲得框框响)手玩几组数据大概能做,后面再认真看\(\rm{T2}\)看到树直接小命不保喵了个咪的,这我打鸡毛啊又......
  • 11.19 CW 模拟赛 T3.又见 LIS
    前言老登你也知道你又在出\(\rm{LIS}\)算法首先我们需要注意到,本质上和随机了一个\(1\simn\)的排列没有任何区别具体的,任意一个\(\rm{LIS}\)数列,都仅仅是由大小关系推过来的,并且可以证明,\(\rm{LIS}\)数列相同,当且仅当大小关系完全相同注意到这个之后(事......
  • HZOI NOIP 2024 Round 24 T2 取石子 官方做法
    发现大多数的题解都是不同于官方题解的做法,这里我将介绍官方题解做法。Solution证明先手是否可以必胜的方法相差无几,为了方便后边行文,这里介绍我的思路:考虑各堆石子和为奇数的情况(以下简称为“奇状态”,另一种称为“偶状态”)一定先手必胜:两人一次取一个即可。考虑偶状态。可以发......
  • 11.19 CW 模拟赛 T2.终端命令
    算法考场上想到了一些,但不多容易想到把相关的字符串全部加到字典树中然后操作只有两种嘛键盘输入按tab显然的,我们可以构造一颗\(\rm{trie}\)树,对于键盘输入,我们把\(\rm{trie}\)树上的点向其子节点连一条权值为\(1\)的点对于按tab的情况,分两种情况讨论......