「JLOI2015」管道连接 解题报告

「JLOI2015」管道连接

先按照斯坦纳树求一个

然后合并成斯坦纳森林

直接枚举树的集合再dp一下就好了



Code:

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using std::min;
const int N=1<<10;
template <class T>
void read(T &x)
{
    x=0;char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
int head[N],to[N<<3],Next[N<<3],edge[N<<3],cnt;
void add(int u,int v,int w)
{
    to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
}
int n,m,p,dp[N][N],f[N],yuu[12];
int q[N*N],l,r,vis[N];
void spfa(int s)
{
    while(l<=r)
    {
        int now=q[l++];
        vis[now]=0;
        for(int v,i=head[now];i;i=Next[i])
            if(dp[v=to[i]][s]>dp[now][s]+edge[i])
            {
                dp[v][s]=dp[now][s]+edge[i];
                if(!vis[v]) vis[q[++r]=v]=1;
            }
    }
}
int main()
{
    read(n),read(m),read(p);
    memset(dp,0x3f,sizeof dp);
    memset(f,0x3f,sizeof f);
    for(int u,v,w,i=1;i<=m;i++)
    {
        read(u),read(v),read(w);
        add(u,v,w),add(v,u,w);
    }
    for(int c,d,i=1;i<=p;i++)
    {
        read(c),read(d);
        yuu[c]|=1<<i-1;
        dp[d][1<<i-1]=0;
    }
    for(int s=1;s<1<<p;s++)
    {
        l=1,r=0;
        for(int i=1;i<=n;i++)
        {
            for(int t=s-1&s;t;t=t-1&s)
                if(dp[i][s]>dp[i][t]+dp[i][t^s])
                    dp[i][s]=dp[i][t]+dp[i][t^s];
            if(dp[i][s]<dp[0][0]) q[++r]=i;
        }
        spfa(s);
        for(int i=1;i<=n;i++) f[s]=min(f[s],dp[i][s]);
    }
    int ct=0;
    while(yuu[ct+1]) ++ct;
    for(int s=1;s<1<<ct;s++)
    {
        int sta=0;
        for(int i=0;i<ct;i++)
            if(s>>i&1)
                sta|=yuu[i+1];
        for(int i=0;i<ct;i++)
            if(s>>i&1)
                f[sta]=min(f[sta],f[sta^yuu[i+1]]+f[yuu[i+1]]);
    }
    printf("%d\n",f[(1<<p)-1]);
    return 0;
}


2019.2.26

原文地址:https://www.cnblogs.com/butterflydew/p/10436311.html

时间: 2024-07-30 13:46:55

「JLOI2015」管道连接 解题报告的相关文章

tyvj P2018 「Nescaf&#233;26」小猫爬山 解题报告

P2018 「Nescafé26」小猫爬山 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). 描述 Freda和rainbow只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N只小猫的重量分别是C1.C2……CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租用一辆缆车,Freda和rainb

「MacOS」网络连接状态查看工具Internet Status

前言 Internet Status Mac版是Mac平台上的一款网络连接状态查看工具.Internet Status Mac版可以让用户马上从菜单栏上了解到本机的互联网/网络连接的连接状态. internet status mac能做什么 显示您的公共和本地IP地址此时上载/下载速度.以.txt格式导出包含日期和时间的连接状态报告.适用于Macbook AIr,Macbook Pro,iMac,MacBook,MacPro,Mac Mini.准备好新的MacOS Sierra.显示当前会话的网

「THUSCH 2017」大魔法师 解题报告

「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵,随便搞搞就成了,卡常 Code: #include <cstdio> #include <cstring> namespace io { const int SIZE=(1<<21)+1; char ibuf[SIZE],*iS,*iT,obuf[SIZE],*oS=ob

「十二省联考 2019」字符串问题 解题报告

「十二省联考 2019」字符串问题 当场就去世了,我这菜人改了一下午 考虑一个A,B之间的连边实际表示了两个A之间的有向边,然后把A的连边处理好,就转成了拓扑排序找环+最长链 但是边数很多,考虑优化连边 A,B之间的连边显然没法优化的,考虑一个B可以表示所有它的后缀A 把串反向建出SAM,然后一个B的后缀就是par树的子树 可以拿倍增定位 好了这题就没了 注意到一个事情,定位的点可能重复,于是对SAM拆点,每个点挂一个vector表示一个A或者B的点在SAM的这个位置 然后考虑如何连边 一个B所

「csp校内训练 2019-10-24」解题报告

「csp校内训练 2019-10-24」解题报告 T1.猴猴吃苹果 \(Description\) 猴猴最喜欢在树上玩耍,一天猴猴又跳上了一棵树,这棵树有 \(N \ (N \leq 50000)\) 个苹果,每个苹果有一个编号,分别为 \(0\) ~ \(N - 1\) 它们之间由 \(N-1\) 个树枝相连,猴猴可以从树枝的一端爬到树枝的另一端,所以猴猴可以从任意一个苹果的位置出发爬到任意猴猴想去的苹果的位置. 猴猴开始在编号为 \(K \ (K < N)\) 的苹果的位置,并且把这个苹果吃

「csp校内训练 2019-10-30」解题报告

「csp校内训练 2019-10-30」解题报告 T1.树 题目链接(逃) \(Description\): 现在有一棵树,共 \(N\) 个节点. 规定:根节点为 \(1\) 号节点,且每个节点有一个点权. 现在,有 \(M\) 个操作需要在树上完成,每次操作为下列三种之一: \(1 \ x \ a\):操作 \(1\),将节点 \(x\) 点权增加 \(a\). \(2 \ x \ a\):操作 \(2\),将以节点 \(x\) 为根的子树中所有点的权值增加 \(a\). \(3 \ x\)

JLOI2015 解题报告

那个嘛= =,虽说是JLOI的解题报告但还差第一题没写= =,就这样行啦 T2:[JLOI2015]城池攻占 首先这道题我们先考虑暴力,也就是每个点向父亲跑,我们考虑能否一起做,可以发现在同一个点的骑士可以用一个堆维护一起跳(因为没有改变优先级的操作)然后再用懒标记维护,我们可以直接用一个可合并堆来维护就可以啦 当然这道题用线段树,倍增都是可行的,就是空间比较拙计罢了,需要用一些奇奇怪怪的方法来干 CODE: 1 #include<cstdio> 2 #include<iostream&

解题报告 之 2015蓝桥杯 垒骰子

解题报告 之 2015蓝桥杯 垒骰子 赌圣 atm 晚年迷恋上了垒骰子,就是把骰子一个垒在还有一个上边.不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的对面是 4.2 的对面是 5,3 的对面是 6. 如果有 m 组相互排斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来. atm 想计算一下有多少种不同的可能的垒骰子方式. 两种垒骰子方式同样,当且仅当这两种方式中相应高度的骰子的相应数字的朝向都同

「IOI2018」Highway 高速公路收费

目录 「IOI2018」Highway 高速公路收费 题目描述: 实现细节: 输入格式: 输出格式: 样例: 数据范围与提示: 子任务: 题解: Code 「IOI2018」Highway 高速公路收费 题目描述: 在日本,城市是用一个高速公路网络连接起来的.这个网络包含 \(N\) 个城市和 \(M\) 条高速公路.每条高速公路都连接着两个不同的城市.不会有两条高速公路连接相同的两个城市.城市的编号是从 \(0\) 到 \(N-1\) ,高速公路的编号则是从 \(0\) 到 \(M-1\) .