首页 > 编程语言 >【算法学习笔记】斯坦纳树

【算法学习笔记】斯坦纳树

时间:2022-10-28 17:35:57浏览次数:72  
标签:ver idx vis int memset 笔记 斯坦纳 算法

【算法学习笔记】斯坦纳树

因为离散的论文打算写这个,所以开始学。
今天先写了模板题,存一下代码,等写论文的时候再来补充原理

模板

#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> pii;
const int N = 505, inf = 0x3f3f3f3f;
int h[N], e[N*2], ne[N*2], w[N*2], idx;
bool vis[N];
int f[N][5000], S[N], n, m, k;
priority_queue <pii, vector <pii>, greater<pii>> q;

void add (int a, int b, int c) {
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}

void dijkstra (int s) {
    memset (vis, false, sizeof vis);
    while (!q.empty ()) {
        auto t = q.top ();
        int ver = t.second;
        q.pop ();
        if (vis[ver])   continue;
        vis[ver] = true;

        for (int i = h[ver]; ~i; i = ne[i]) {
            int j = e[i];
            if (f[j][s] > f[ver][s] + w[i]) {
                f[j][s] = f[ver][s] + w[i];
                q.push ({f[ver][s], j});
            }
        }
    }
}

int main () {
    cin >> n >> m >> k;
    memset (h, -1, sizeof h);
    memset (f, 0x3f, sizeof f);
    for (int i = 1; i <= m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        add (a, b, c), add (b, a, c);
    }
    for (int i = 1; i <= k; i++)    cin >> S[i], f[S[i]][1<<(i-1)] = 0;

    for (int s = 1; s < (1 << k); s++) {
        for (int i = 1; i <= n; i++) {
            for (int t = s & (s - 1); t; t = s & (t - 1)) {
                f[i][s] = min (f[i][s], f[i][t] + f[i][s ^ t]);
            }
            if (f[i][s] != inf)     q.push ({f[i][s], i});
        }
        dijkstra (s);
    }
    cout << f[S[1]][(1<<k) - 1];
}

习题

P6192 【模板】最小斯坦纳树

标签:ver,idx,vis,int,memset,笔记,斯坦纳,算法
From: https://www.cnblogs.com/CTing/p/16836825.html

相关文章

  • docker笔记
    docker是linux容器的一种实现,也是现在最火的容器。容器就是一个隔离的进程,具有启动快、占用资源少、占用空间少等特点。dockerfile是文本配置文件imagefile......
  • 量化算法题
    packagecom.zb.swdata.core;publicclassTest{publicstaticclassNode{publicNodenextnode;privateIntegernum;......
  • 【视频】Copula算法原理和R语言股市收益率相依性可视化分析|附代码数据
    阅读全文:http://tecdat.cn/?p=6193copula是将多变量分布函数与其边缘分布函数耦合的函数,通常称为边缘。在本视频中,我们通过可视化的方式直观地介绍了Copula函数,并通过R软......
  • 实验一:决策树算法实验
    【实验目的】理解决策树算法原理,掌握决策树算法框架;理解决策树学习算法的特征选择、树的生成和树的剪枝;能根据不同的数据类型,选择不同的决策树算法;针对特定应用场景及......
  • MSSQL基本常用笔记
    --读取库中的所有表名selectnamefromsysobjectswherextype='u'orderbynamedesc--读取指定表的所有列名 selectnamefromsyscolumnswhereid=(selectmax(......
  • MHATC系统笔记2
    Tip:1、修改FDO.jar解决导入长期计划时,如果航路为空导入不成功问题;原来的代码是有条件删除长期计划历史库中的数据,导致从长期计划向长期计划历史库中转存数据时两个表中存在......
  • 16_Vue列表渲染中key的工作原理和虚拟DOM对比算法
    key的作用粗略的讲,key的作用就是给节点设置一个唯一的标识就像我们人类社会中,每个人的身份证号一样在大部分对key要求不是很严格的场景下,使用index作为key是没问......
  • 第九周学习笔记
    第六章  信号和信号处理一、主要内容1.信号和中断信号:发给进程的请求,将进程从正常执行转移到中断处理。中断:是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常......
  • c语言—自定义类型(结构体,枚举,联合)进阶篇—笔记
    个人觉得结构体相当于类,应该是比较实用的功能。1.结构体结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。structtag{member-list;}variable-l......
  • 物联网之RS485通讯笔记
    传输方式:差分传输方式;传输距离:1200米;传输协议:Modbus协议;传输速率:10mbps;线路最大连接设备数:128台;波特率:即设备在一秒内最大信息输出字节长度;例如:9600bit/s指的就是设......